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

使用两个不同的 baseUrl - AFHTTPSessionManager

快速使用 AFHTTPSessionManager

使用 AFNetworking 2.0 的 POST 请求 - AFHTTPSessionManager