分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

AFHTTPSessionManager下载文件 及下载中 进度条处理,进度条处理需要特别注意,要加载NSRunLoop 中

发布时间:2023-09-06 01:07责任编辑:熊小新关键词:暂无标签

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 中

原文地址:http://www.cnblogs.com/dujiahong/p/7459327.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved