利用NSURLSessionDownloadTask实现的下载器
2018-05-30 本文已影响5人
让代码飞
站在巨人的肩膀上深入了解了一下下载,下载实现的方式有很多种,但是基于系统提供的NSURLSessionDownloadTask实现起来更简单,快捷,达到的效果还是不错的。本篇主要实现了断点下载、后台下载、程序杀死启动之后继续下载等。[demo](https://pan.baidu.com/s/140F2urS9RtViEqR8-YFxog)
讲一下NSURLSessionDownloadTask
知道它的前提是必然知道NSURLSession
NSURLSession 作为iOS7的一个新特性,它积极进化,除了保留NSURLConnection的基本组件NSURLRequest,NSURLCache,也增加NSURLSessionConfiguration和NSURLSessionTask(包含:
NSURLSessionDataTask: 普通的网络数据请求
NSURLSessionUploadTask: 上传
NSURLSessionDownloadTask: 下载
NSURLSessionDownloadTask 优点以下几个
a.不受苹果后台设置的时间的限制,可以在程序退到后台后继续session中未完成的task,直到全部完成退出后台.
b.在服务器满足苹果API要求的情况下,让断点续传摆脱bytes=%llu-,更简单易用
c.在下载大的文件时做了相应的优化.之前为了避免下载的大的文件都存放在内存中导致内存激增,通常的优化方案是存入沙盒 ,然后依次拼接. NSURLSessionDownloadTask就是体贴到帮你解决这个问题(在下载过程中,打开沙盒文件,可以看到很多的.tmp临时文件),而我们需要做的就是在下载完成的时候,在相应的回调中把拼接完成的文件移动/拷贝到指定的文件夹下(使用AFNetWorking 则只需要指出存放的最终路径)
几个要用到的代理方法
//下载成功的回调
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location{
//location是一个下载时候的开辟的临时地址,下载成功之后将文件放到自己指定的地址
}
//请求完毕之后的方法,这里可以检测到下载失败
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error{
}
//拿到下载的进度
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
}
//暂停下载
[model.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
//resumeData当前下载的到哪里的信息
model.resumeData = resumeData;
}];
//恢复下载
[self.session downloadTaskWithResumeData:model.resumeData]
唉,本人渣渣一个,好多问题不懂,都是借鉴别人的东西,一点点的看,具体的代码就不贴了,没有太大的意思,如果确实有需要可以去下载一个。