AFHTTPSessionManager下载文件 及下载中 进度条处理,进度条处理需要特别注意,要加载NSRunLoop 中
Posted 宁静暖风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(0, 0, 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 = 0; [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(180 / WIDTH_5S_SCALE); make.height.mas_equalTo(100 / WIDTH_5S_SCALE); make.center.equalTo(weakSelf); }]; [self.topView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.left.right.equalTo(weakSelf.bgView); make.height.mas_equalTo(30 / WIDTH_5S_SCALE); }]; [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(weakSelf.topView); make.centerY.equalTo(weakSelf.topView).offset(-5 / WIDTH_5S_SCALE); //make.center.equalTo(weakSelf.topView); }]; [self.closeButton mas_makeConstraints:^(MASConstraintMaker *make) { make.width.height.mas_equalTo(25); make.centerX.equalTo(weakSelf.bgView.mas_right).offset(-3 / WIDTH_5S_SCALE); make.centerY.equalTo(weakSelf.bgView.mas_top).offset(3 / 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(-10 / WIDTH_5S_SCALE); make.left.equalTo(weakSelf.topView.mas_left); make.right.equalTo(weakSelf.topView.mas_right); make.height.mas_equalTo(25); }]; [self.numberLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(weakSelf.contentView.mas_top).offset(0 / WIDTH_5S_SCALE); make.height.mas_equalTo(30 / 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(5 / WIDTH_5S_SCALE); make.left.equalTo(weakSelf.contentView.mas_left).offset(10 / WIDTH_5S_SCALE); make.right.equalTo(weakSelf.contentView.mas_right).offset(-10 / WIDTH_5S_SCALE); make.height.mas_equalTo(10); }]; } return self; } #pragma mark -- Event - (void)show{ [[UIApplication sharedApplication].delegate.window addSubview:self]; [UIView animateWithDuration:0.15 animations:^{ self.alpha = 1; }]; } - (void)closeBtnClick{ [UIView animateWithDuration:.15 animations:^{ self.alpha = 0 ; } completion:^(BOOL finished) { [self removeFromSuperview]; }]; } #pragma mark -- init - (UIView *)backView{ if (!_backView) { _backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 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 = 5; _bgView.layer.masksToBounds = YES; } return _bgView; } - (UIView *)topView{ if (!_topView) { _topView = [[UIView alloc] init]; _topView.backgroundColor = getColor(mainColor); _topView.layer.cornerRadius = 5; _topView.layer.masksToBounds = YES; } return _topView; } - (UIView *)contentView{ if (!_contentView) { _contentView = [[UIView alloc] init]; _contentView.backgroundColor = getColor(whiteColor); _contentView.layer.cornerRadius = 5; _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:26]]; _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 = 5; _progressView.layer.masksToBounds = YES; [_progressView setProgress:0 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 %%",100 * progress]; if (progress >= 1) { [self closeBtnClick]; } } @end
以上是关于AFHTTPSessionManager下载文件 及下载中 进度条处理,进度条处理需要特别注意,要加载NSRunLoop 中的主要内容,如果未能解决你的问题,请参考以下文章
iOS网络——AFNetworking AFHttpSessionManager源码解析
iOS网络——AFNetworking AFHttpSessionManager源码解析
AFNetworking 2.0 AFHTTPSessionManager