一、NSURLSessionConfiguration
介绍:分别配置每一个 session 对象。(NSURLConnection 很难做到)
分类:
1) defaultSessionConfiguration: 默认 session 配置,类似 NSURLConnection 的标准配置,使用硬盘来存储缓存数据。
2) backgroundSessionConfiguration: 后台session配置,与默认配置类似,不同的是会在后台开启另一个线程来处理网络数据。
注意: 这里如果设置了超时限制的话,可能会导致一直下载失败。因为后台下载会根据设备的负载程度决定分配下载的资源。
3) ephemeralSessionConfiguration: 临时session配置,与默认配置相比,这个配置不会将缓存、cookie等存在本地,只会存在内存里,所以当程序退出时,所有的数据都会消失。
二、NSURLSessionTask
介绍:使用 NSURLSessionTask 来具体执行网络请求的任务。NSURLSessionTask 支持网络请求的取消、暂停和恢复。
分类:
1) NSURLSessionDataTask: 处理一般的 NSData 数据对象,从服务器获取 JSON 或 XML 等,但不支持后台获取。
2) NSURLSessionDownloadTask: 用于下载文件,支持后台下载。
3) NSURLSessionUploadTask: 用于上传文件,支持后台上传。
三、NSSession
总的来说,创建一个 session,需要配置 configuration 和 task。
四、实践总结
在两年前我使用了 ASI 有半年时间,后来看到已经没再继续维护了,就用了 apple 原生的 NSURLConnection,而且用了适配器模式写得。所以为了兼容以前的版本,我是使用 delegate 的方式来实现回调处理的。(其实 AFNetworking 2.0 已经支持了 NSURLSession,想使用第三方框架的可以考虑。)
1、断点下载
创建 task 的时候
NSData* downloadedData = ... // 上一次中断下载时候,保存的临时文件。
httpTask = [httpSession downloadTaskWithResumeData: downloadedData]; 中断 task
[httpTask cancelByProducingResumeData:^(NSData *resumeData) {
// 把 resumeData 存到了一个临时文件上,以便 app 完全关闭后,也能继续断点下载。
}];
在下载完成的时候
-(void) URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
记得把下载过程中用来存储 resumeData 的临时文件给删除掉。
}