利用 NSURLSession 实现文件下载


    利用 NSURLSession 实现文件下载,首先需要创建一个 NSURLSessionDownloadTask; 由于需要实时监听下载进度,所以,需要实现 <NSURLSessionDownloadDelegate>方法,这样,就需要自定义一个会话 session.并且制定代理.
    
    // NSURLSession 下载的断点续传实现步骤:
    
    1. 懒加载全局网络会话
    {
        -(NSURLSession *)session
        {
            if (!_session) {
                
                NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
                
                _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
                
            }
            return _session;
        }
    }
    2. 利用全局网络会话,创建下载 task, 开始下载任务
    {
        self.task = [self.session downloadTaskWithURL:url];
        
        [self.task resume];
    }
    3. 在代理方法中,实时监听下载进度
    {
        // 监听下载进度的方法
        // bytesWritten :本次下载的字节数
        // totalBytesWritten :已经下载的字节数
        // totalBytesExpectedToWrite :下载文件的总字节数
        -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
        {
            
            NSLog(@"代理回调~");
            
            float progress = (float)totalBytesWritten/totalBytesExpectedToWrite;
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                self.progress.progress = progress;
                
            });
            
        }
        
        // 完成下载的时候调用
        -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
        {
            NSLog(@"下载完成%@",location);
        }
        
        // 断点续传的代理方法,暂时什么都不写
        -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
        {
            NSLog(@"%s",__FUNCTION__);
        }
    }
    4. 当点击暂停之后,应该取消下载任务,记录当前下载的文件数据,并且将 task 任务设为 nil
    {
        [self.task cancelByProducingResumeData:^(NSData *resumeData) {
            
            self.reusemData = resumeData;
            
            self.task = nil;
        }];
    }
    5. 当点击继续之后,应该从上次下载的进度继续下载,这时,重新创建下载 task, 并且是根据上次记录的文件下载数据来实例化下载任务
    {
        if (!self.reusemData) {
            return;
        }
        
        self.task = [self.session downloadTaskWithResumeData:self.reusemData];
        
        self.reusemData = nil;
        
        [self.task resume];
    }
    
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值