zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    JDK6和JDK7中的substring()方法
    考试结束
    今天之总结
    暂别
    珍惜
    放弃
    我男神
    心态
    稳住,我或许能赢
    还是做好自己吧
  • 原文地址:https://www.cnblogs.com/dujiahong/p/7459327.html
Copyright © 2011-2022 走看看