参考文章1, apple文档

一、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 的临时文件给删除掉。

}

05-11 13:39