因为需要做个下载项目需求,所以专门研究了下,大文件下载断点续传的功能,也比较了NSURLSession和AFN的优缺点。最终选用了NSURLSession + NSURLSessionDataTask来进行下载,由于只是demo,所以并没有对UI进行调整。默认下载位置:(~/download)
首先demo实现环境为Mac环境,但是iOS同样可以参考,两者的差别只有UI控件的不同而已。
demo中实现了的功能和技术
- 下载文件的开始、暂停、继续和删除。
- 多个文件并行异步下载
- 文件边下载边写入沙盒,避免下载存入内存,导致内存飙高的问题。
- 杀死APP后重启,可获得上次下载的内容,进行继续下载
- 使用归档(NSKeyedArchiver、NSKeyedUnarchiver)来对本地Model(MyDownData)进行数据归档
- @synchronized 保证线程安全
- NSOperationQueue 进行下载文件写入沙盒
- 一个NSURLSession 处理多个Task,每添加一个下载项目便生成一个NSURLSessionDataTask的对象
项目中结构如图:
下面是一些关键代码:
下载Task的初始化方法:新增下载和继续下载
NSURLSessionDataTask的Delegate
model的.h和.m文件
最终效果图: