AFHTTPSessionManager下载文件 及下载中 进度条处理,进度条处理需要特别注意,要加载NSRunLoop 中
1.下载文件 和进度条处理代码
- (void)timer:(NSTimer *)timer{
// 另一个View中 进度条progress属性赋值
_downloadView.progress = self.pressing;
if (self.pressing >= 1.0) {
[timer invalidate];
}
}
-(void)downloadWithUrlString:(NSString *)urlString
{
//1.创建会话管理者
AFHTTPSessionManager *manager =[AFHTTPSessionManager manager]; NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"];
// NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
__weak typeof(self)weakself = self;
NSURLSessionDownloadTask *download = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
//监听下载进度
//completedUnitCount 已经下载的数据大小
//totalUnitCount 文件数据的中大小
// _downloadView.progressView.progress = 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount;
NSLog(@"%f",1.0 *downloadProgress.completedUnitCount / downloadProgress.totalUnitCount); _pressing = 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount;
NSRunLoop *mainLoop = [NSRunLoop currentRunLoop];
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.016 target:weakself selector:@selector(timer:) userInfo:nil repeats:NO];
// 添加到任务池中
[mainLoop addTimer:timer forMode:NSDefaultRunLoopMode];
[mainLoop run]; } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
/**
* 1:1:请求路径:NSUrl *url = [NSUrl urlWithString:path];从网络请求路径 2:把本地的file文件路径转成url,NSUrl *url = [NSURL fileURLWithPath:fullPath];
2:返回值是一个下载文件的路径
*
*/
// 在只定路径下 创建文件夹:fireFileDataSource
NSString *fullPathFileDataSource = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"fireFileDataSource"];
[weakself.fileToolManager createPath:fullPathFileDataSource];
// 下载文件存储的路径 拼接上文件的名字
NSString *fullPath = [NSString stringWithFormat:@"%@/%@",fullPathFileDataSource,response.suggestedFilename];
return [NSURL fileURLWithPath:fullPath];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
/**
*filePath:下载后文件的保存路径
*/
NSLog(@"%@",filePath);
}]; //3.执行Task
[download resume];
} 注意问题 如果只是定时器 不会走,需要添加到NSRunLoop中 才行 这个是一个坑 重要代码注意如下
- (void)timer:(NSTimer *)timer{
// 另一个View中 进度条progress属性赋值
_downloadView.progress = self.pressing;
if (self.pressing >= 1.0) {
[timer invalidate];
}
}
NSRunLoop *mainLoop = [NSRunLoop currentRunLoop];
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.016 target:weakself selector:@selector(timer:) userInfo:nil repeats:NO];
// 添加到任务池中
[mainLoop addTimer:timer forMode:NSDefaultRunLoopMode];
[mainLoop run];
2.进度条代码 写在另一个View中 帖出如下
弹出view代码
_downloadView = [[DownloadView alloc] initWithFrame:CGRectMake(, , SCREEN_WIDTH, SCREEN_HEIGHT)];
[_downloadView show];
(1)DownloadView.h
#import <UIKit/UIKit.h> @interface DownloadView : UIView @property(nonatomic,strong) UIProgressView *progressView;//进度条
@property(nonatomic,assign) CGFloat progress; - (void)show; @end
(2)DownloadView.m
#import "DownloadView.h" @interface DownloadView () @property(nonatomic,strong) UIView *backView; //后背景
@property(nonatomic,strong) UIView *bgView; //背景
@property(nonatomic,strong) UIView *topView; //上面
@property(nonatomic,strong) UIView *contentView;//内容
@property(nonatomic,strong) UILabel *titleLabel;//标题
@property(nonatomic,strong) UILabel *numberLabel;//数字 @property(nonatomic,strong) UIButton *closeButton;//关闭按钮
@property(nonatomic,strong) UIView *ttView; @end @implementation DownloadView - (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
self.alpha = ;
[self addSubview:self.backView];
[self.backView addSubview:self.bgView];
[self.backView addSubview:self.topView];
[self.backView addSubview:self.contentView];
[self.backView addSubview:self.titleLabel];
[self.backView addSubview:self.numberLabel];
[self.backView addSubview:self.progressView];
[self.backView addSubview:self.closeButton];
[self.backView addSubview:self.ttView]; __weak __typeof(self)weakSelf = self;
[self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo( / WIDTH_5S_SCALE);
make.height.mas_equalTo( / WIDTH_5S_SCALE);
make.center.equalTo(weakSelf);
}];
[self.topView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.equalTo(weakSelf.bgView);
make.height.mas_equalTo( / WIDTH_5S_SCALE);
}];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(weakSelf.topView);
make.centerY.equalTo(weakSelf.topView).offset(- / WIDTH_5S_SCALE);
//make.center.equalTo(weakSelf.topView);
}];
[self.closeButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.height.mas_equalTo();
make.centerX.equalTo(weakSelf.bgView.mas_right).offset(- / WIDTH_5S_SCALE);
make.centerY.equalTo(weakSelf.bgView.mas_top).offset( / WIDTH_5S_SCALE);
}];
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(weakSelf.topView.mas_bottom);
make.left.equalTo(weakSelf.bgView.mas_left);
make.bottom.equalTo(weakSelf.bgView.mas_bottom);
make.right.equalTo(weakSelf.bgView.mas_right);
}];
[self.ttView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(weakSelf.topView.mas_bottom).offset(- / WIDTH_5S_SCALE);
make.left.equalTo(weakSelf.topView.mas_left);
make.right.equalTo(weakSelf.topView.mas_right);
make.height.mas_equalTo();
}];
[self.numberLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(weakSelf.contentView.mas_top).offset( / WIDTH_5S_SCALE);
make.height.mas_equalTo( / WIDTH_5S_SCALE);
make.left.equalTo(weakSelf.contentView.mas_left);
make.right.equalTo(weakSelf.contentView.mas_right);
}];
[self.progressView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(weakSelf.numberLabel.mas_bottom).offset( / WIDTH_5S_SCALE);
make.left.equalTo(weakSelf.contentView.mas_left).offset( / WIDTH_5S_SCALE);
make.right.equalTo(weakSelf.contentView.mas_right).offset(- / WIDTH_5S_SCALE);
make.height.mas_equalTo();
}]; }
return self;
} #pragma mark -- Event - (void)show{
[[UIApplication sharedApplication].delegate.window addSubview:self];
[UIView animateWithDuration:0.15 animations:^{
self.alpha = ;
}];
} - (void)closeBtnClick{
[UIView animateWithDuration:. animations:^{
self.alpha = ;
} completion:^(BOOL finished) {
[self removeFromSuperview];
}];
} #pragma mark -- init - (UIView *)backView{
if (!_backView) {
_backView = [[UIView alloc] initWithFrame:CGRectMake(, , SCREEN_WIDTH, SCREEN_HEIGHT)];
_backView.backgroundColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:0.75];
}
return _backView;
} - (UIView *)bgView{
if (!_bgView) {
_bgView = [[UIView alloc] init];
_bgView.backgroundColor = getColor(whiteColor);
_bgView.layer.cornerRadius = ;
_bgView.layer.masksToBounds = YES;
}
return _bgView;
} - (UIView *)topView{
if (!_topView) {
_topView = [[UIView alloc] init];
_topView.backgroundColor = getColor(mainColor);
_topView.layer.cornerRadius = ;
_topView.layer.masksToBounds = YES;
}
return _topView;
} - (UIView *)contentView{
if (!_contentView) {
_contentView = [[UIView alloc] init];
_contentView.backgroundColor = getColor(whiteColor);
_contentView.layer.cornerRadius = ;
_contentView.layer.masksToBounds = YES;
}
return _contentView;
} - (UIView *)ttView{
if (!_ttView) {
_ttView = [[UIView alloc] init];
_ttView.backgroundColor = getColor(whiteColor);
}
return _ttView;
} - (UILabel *)titleLabel{
if (!_titleLabel) {
_titleLabel = [[UILabel alloc] init];
_titleLabel.font = DEF_FontSize_14;
_titleLabel.textColor = getColor(@"fa2671");
_titleLabel.textAlignment = NSTextAlignmentCenter;
_titleLabel.text = @"下载硬件程序";
}
return _titleLabel;
} - (UILabel *)numberLabel{
if (!_numberLabel) {
_numberLabel = [[UILabel alloc] init];
//_numberLabel.font = DEF_FontSize_26;
[_numberLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:]];
_numberLabel.textColor = getColor(bgColor);
_numberLabel.textAlignment = NSTextAlignmentCenter;
// _numberLabel.text = @"50%";
}
return _numberLabel;
} - (UIProgressView *)progressView{
if (!_progressView) {
_progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
_progressView.progressTintColor = getColor(bgColor);//进度条颜色
_progressView.trackTintColor = getColor(@"d2d2d2");//默认也为灰色
//_progressView.progressImage = [UIImage imageNamed:@"icon_vedio_progress"];
//_progressView.trackImage = [UIImage imageNamed:@"icon_vedio_progressgrey"];
_progressView.progressViewStyle = UIProgressViewStyleDefault;
_progressView.layer.cornerRadius = ;
_progressView.layer.masksToBounds = YES;
[_progressView setProgress: animated:YES]; }
return _progressView;
} - (UIButton *)closeButton{
if (!_closeButton) {
_closeButton = [[UIButton alloc] init];
[_closeButton setBackgroundImage:[UIImage imageNamed:@"icon_vedio_close"] forState:UIControlStateNormal];
[_closeButton addTarget:self action:@selector(closeBtnClick) forControlEvents:UIControlEventTouchUpInside];
}
return _closeButton;
} /*
- (void)sourceTimer{
dispatch_source_t _sourceTimer;
//创建全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建定时器
_sourceTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
//定时器延时
NSTimeInterval delayTime = 1.0f;
//定时器时间间隔
NSTimeInterval timeInteral = 0.5f;
//设置开始时间
dispatch_time_t startDelayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayTime * NSEC_PER_SEC));
//设置定时器
dispatch_source_set_timer(_sourceTimer, startDelayTime, timeInteral*NSEC_PER_SEC, 0.1*NSEC_PER_SEC);
//执行事件
dispatch_source_set_event_handler(_sourceTimer, ^{
self.progressView.progress += 0.1; //销毁定时器
dispatch_source_cancel(_sourceTimer);
}); //启动计时器
dispatch_resume(_sourceTimer);
}*/ - (void)setProgress:(CGFloat)progress{
NSLog(@"进度进行时。。。。。。。。。。。。。。。。。。%f",progress);
_progress = progress;
_progressView.progress = progress;
self.numberLabel.text = [NSString stringWithFormat:@"%.f %%", * progress];
if (progress >= ) {
[self closeBtnClick];
}
} @end
AFHTTPSessionManager下载文件 及下载中 进度条处理,进度条处理需要特别注意,要加载NSRunLoop 中的更多相关文章
- [Android] Android 用于异步加载 ContentProvider 中的内容的机制 -- Loader 机制 (LoaderManager + CursorLoader + LoaderManager.LoaderCallbacks)
Android 用于异步加载 ContentProvider 中的内容的机制 -- Loader 机制 (LoaderManager + CursorLoader + LoaderManager.Lo ...
- ssh整合思想初步 struts2与Spring的整合 struts2-spring-plugin-2.3.4.1.jar下载地址 自动加载Spring中的XML配置文件 Struts2下载地址
首先需要JAR包 Spring整合Structs2的JAR包 struts2-spring-plugin-2.3.4.1.jar 下载地址 链接: https://pan.baidu.com/s/1o ...
- [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型
[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型 作者:u0u0 - iTyran 在上一节中,我们分析了OBJ格式.OBJ格式优点是文本形式,可读 ...
- 教您如何在Word的mathtype加载项中修改章节号
在MathType数学公式编辑器中,公式编号共有五部分内容:分别是章编号(Chapter Number).节编号(Section Number).公式编号(Equation Number).括号(En ...
- vs2010 未能正确加载方案中的一个或多个项目
Visual studio在打开解决方案时,往往会碰到一个这样的错误,提示说:未能正确加载方案中的一个或多个项目: 我们可以通过以下步骤来解决该问题:首先,在相应的sln类型文件上点击右键,选择用记事 ...
- springboot属性类自动加载配置文件中的值
springboot属性类自动加载配置文件中的值,如Person类加载在yml中配置的name,age等属性值,可以通过如下步骤获取: 类上添加@ConfigurationProperties注解,p ...
- 加载 页面 中js 方法
js 文件中 var mingchen= mingchen|| { init: function (){ } }; 文件中 mingchen.init(); 注意问题: 在新加载 页面中 ...
- WPF中动态加载XAML中的控件
原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...
- 用MVVM模式开发中遇到的零散问题总结(5)——将动态加载的可视元素保存为图片的控件,Binding刷新的时机
原文:用MVVM模式开发中遇到的零散问题总结(5)--将动态加载的可视元素保存为图片的控件,Binding刷新的时机 在项目开发中经常会遇到这样一种情况,就是需要将用户填写的信息排版到一张表单中,供打 ...
随机推荐
- vue项目刷新当前页面
场景: 有时候我们在vue项目页面做了一些操作,需要刷新一下页面. 解决的办法及遇到的问题: this.$router.go(0).这种方法虽然代码很少,只有一行,但是体验很差.页面会一瞬间的白屏,体 ...
- 一篇文章搞明白CORS跨域
面试问到数据交互的时候,经常会问跨域如何处理.大部分人都会回答JSONP,然后面试官紧接着就会问:"JSONP缺点是什么啊?"这个时候坑就来了,如果面试者说它支持GET方式,然后面 ...
- WSDL文档深入分析
借助jdk的wsimort.exe工具生成客户端代码 格式:wsimport -keep url //url为wsdl文件的路径 直接生成客户端代码会抛异常, 无法生成客户端代码, 解决办法: 将 ...
- BestCoder Round #92 1002 Count the Sheep —— 枚举+技巧
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=748&pid=1002 题解: 做题的时候只是想到 ...
- Nginx配置故障转移
当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用. 如果上游服务器的某一台宕机了,直接轮训到下一个~ 8080 8081 8082 关 ...
- elasearch基础教程
Elasticsearch基础教程 翻译:潘飞(tinylambda@gmail.com) 基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助 ...
- system调用命令行命令而不显示命令行窗口
system调用命令行命令而不显示命令行窗口 通常用system调用命令行命令时都会弹出黑底白字的命令行窗口,下面的代码可以不显示弹出的命令行窗口. 代码如下 #pragma comment( lin ...
- Django_model进阶
Django-model进阶 QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. >>> Ent ...
- Python: PS 滤镜--USM 锐化
本文用 Python 实现 PS 滤镜中的 USM 锐化效果,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/detail ...
- 利用Powershell在IIS上自动化部署网站
本文主要讲如何通过Powershell在IIS上自动化部署ASP.NET网站,而不涉及Powershell的基本语法,如果没有Powershell基础的同学也可以把本文作为学习Powershell的基 ...