![]() ![]() 功能: -单个任务下载 -暂停下载任务 -取消下载任务 -断点下载 -显示下载进度及速度 -多任务下载 -分别控制各个任务 在现在移动互联网的浪潮中,手机APP愈来愈依赖网络通信来交互数据。今天咱们就来分享下如何经过使用NSURLSession这个Apple官方提供的网络接口实现文件下载的思路。 NSURLSsession 先来介绍下NSURLSession这个接口。NSURLSession是苹果在WWDC2013上推出的用于替代它的前辈NSURLConnection的。 与NSURLConnection相似,除了同名类NSURLSession,NSURLSession也是指一组相互依赖的类。NSURLSession包括与以前相同的组件,例如NSURLRequest, NSURLCache等。NSURLSession的不一样之处在于,它把 NSURLConnection替换为NSURLSession, NSURLSessionConfiguration,以及3个NSURLSessionTask的子类:NSURLSessionDataTask, NSURLSessionUploadTask, 和NSURLSessionDownloadTask。 与NSURLConnection相比,NSURLSession最直接的改善就是提供了配置每一个会话的缓存,协议,cookie和证书政策(credential policies),甚至跨应用程序共享它们的能力。这使得框架的网络基础架构和部分应用程序独立工做,而不会互相干扰。每个NSURLSession对象都是根据一个NSURLSessionConfiguration初始化的,该NSURLSessionConfiguration指定了上面提到的政策,以及一系列为了提升移动设备性能而专门添加的新选项。 NSURLSession的另外一重要组成部分是会话任务,它负责处理数据的加载,以及客户端与服务器之间的文件和数据的上传下载服务。NSURLSessionTask与NSURLConnection是及其类似的,由于它负责加载数据,而主要的区别在于,任务共享它们父类NSURLSession的共同委托(common delegate)。 NSURLSession支持如下三种会话模式: ![]() 一、默认会话模式(default):默认模式,基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证受权。 二、瞬时会话模式(ephemeral):不储存任何数据在磁盘中,全部数据都保存在RAM中,当会话结束后,缓存数据将被清空。 三、后台会话模式(background):该模式相似于默认模式,只是将上传和下载移至后台处理,须要一个提供一个String用于标识后台会话。 NSURLSession同时也提供了大量的配置选项: ![]() ![]() 配置完会话类型后,就能够获取NSURLSession对象了。获取对象的方法有如下几种: ![]() 一、sharedSession获取的会话使用的是默认配置(default),全局共享的Cookies,Cache和证书。 二、使用构造器构造一个指定配置的会话对象。 三、 使用构造器构造一个指定配置对象,并指定代理及代理列队。 获取完会话对象后就该给对象一个会话任务了。在这里是经过创建一个会话任务对象来实现布置任务的。在一个会话中,NSURLSession支持三种会话任务: 一、数据任务(NSURLSessionDataTask) 使用NSData对象来发送和接收数据。数据任务能够分片返回数据,也能够经过完成处理器一次性返回数据。因为数据任务不存储数据到文件,因此不支持后台会话。 ![]() 二、上传任务(NSURLSessionUploadTask) 一般以文件的形式发送数据,支持后台上传。 ![]() 三、任务(NSURLSessionDownloadTask) 以文件的形式接收数据,当程序不运行时支持后台下载 ![]() 得到任务对象后,就能够对它进行以下操做: ![]() 经过对NSURLSession的简单介绍,你们应该对其有了歌简单的认识,接下就来介绍下如何实现本文开始阶段所展现Demo的全部功能。 Demo详解 先作一些准备工做: 建立一个用于存放下载数据信息的struct DownloadData ![]() 建立一个代理协议,以后会介绍它的用处 ![]() 接着咱们开始创建一个本身的DownloadTask类,用来实现下载DownloadData,并提供暂停任务、断点下载、取消任务、实时更新下载进度及速度等功能: 咱们先来定义一些属性, ![]() 其中, 代理是用于触发以前协议中所定义的方法的, 数组和计时器涌来计算下载速度的, 下载任务id是为了方便管理多个任务。 接着是构造器, ![]() 经过构造器咱们将从外部得到DownloadData,id及delegate。 完成了这些后,就是编写下载方法了, ![]() 这里将自身设置为NSURLSession代理后,就须要在类中遵循NSURLSessionDownloadDelegate协议,并实现其方法。 在这里我实现以下方法, ![]() ![]() 固然,在构造task时也可使用带block的构造器,将task完成后所要执行的操做经过闭包的方式传给task。这样作的话在定义NSURLSession中就无需设置代理了。可是,不使用代理的方法是没法获取到下载任务的实时信息的,故要获取下载进度及速度的话,仍是应该使用NSURLSession代理。 若是completionhandler 闭包和 didFinishDownloadingToURL 方法同时存在的话,优先执行completionhandler,并会忽略didFinishDownloadingToURL方法。 下面是实现实时速度更新的方法, ![]() 而后是暂停任务方法, ![]() 这里要注意的是,cancelByProducingResumeData 生成的NSData中包含的并非以前所下载的数据,而是记录下载产生的临时文件的位置及下载到什么进度的信息,因此并不会占用很大的内存。 任务暂停后,将这次任务清空。 最后是取消任务方法, ![]() 清空记录下载信息数据文件后,再次开始任务就不能继续从以前断开的位置继续下载了。 以上就是DownloadTask类的所有内容了, 最后就是创建一个UI调用下DownloadTask,看看这个类在实际使用中的效果如何。 UI: ![]() 从0-5依次编号控件,包括1个progressView,2个label,3button,并把他们分别放入collection中,如图: ![]() 定义一个taskCollection用于存放全部task,如图: ![]() 初始化界面,并定义6个DownloadTask: ![]() 替3种button分别添加方法: ![]() 最后实现DownloadTaskDelegate代理方法,用于更新UI: ![]() |