普通任务和上传
NSURLSession
针对下载/上传等复杂的网络操作提供了专门的解决方案,针对普通、上传和下载分别对应三种不同的网络请求任务:NSURLSessionDataTask
,NSURLSessionUploadTask
和NSURLSessionDownloadTask
。创建的task
都是挂起状态,需要resume
才能启动。
- 当服务器返回的数据较小时,
NSURLSession
与NSURLConnection
执行普通任务的操作步骤没有区别。 - 执行上传任务时,
NSURLSession
与NSURLConnection
一样需要设置POST请求的请求体进行上传。
下载任务方式
NSURLConnection
下载文件时,先是将整个文件下载到内存,然后再写入到沙盒,如果文件比较大,就会出现内存暴涨的情况。
而使用NSURLSessionUploadTask
下载文件,会默认下载到沙盒中的temp
文件中,不会出现内存暴涨的情况,但是在下载完成后会把temp中的临时文件删除,需要在初始化任务方法时,在completionHandler
回调中增加保存文件的代码。
请求方法的控制
NSURLConnection
实例化对象,实例化开始,默认请求就发送(同步发送),不需要调用start
方法。而cancel
可以停止请求的发送,停止后不能继续访问,需要创建新的请求。
NSURLSession
有三个控制方法,取消(cancel
)、暂停(suspend
)、继续(resume
),暂停以后可以通过继续恢复当前的请求任务。
断点续传实现方式
NSURLConnection
进行断点下载,通过设置访问请求的HTTPHeaderField
的Range
属性,启运行循环,NSURLConnection
的代理方法作为运行循环的事件源,接收到下载数据时代理方法就会持续调用,并使用NSOutputStream
(或者通过文件指针)管道流进行数据保存。
NSURLSession
进行断点下载,当暂停下载任务后,如果 downloadTask
(下载任务)为非空,调用 cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler
这个方法,这个方法接收一个参数,完成处理代码块,这个代码块有一个NSData
参数resumeData
,如果 resumeData
非空,我们就保存这个对象到视图控制器的 resumeData
属性中。在点击再次下载时,通过调用
[ [self.session downloadTaskWithResumeData: self.resumeData]resume]
方法进行继续下载操作。
经过以上比较可以发现,使用NSURLSession进行断点下载更加便捷。
配置信息
NSURLSession
的构造方法(sessionWithConfiguration:delegate:delegateQueue
)中有一个NSURLSessionConfiguration
类的参数可以设置配置信息,其决定了cookie
,安全和高速缓存策略,最大主机连接数,资源管理,网络超时等配置。NSURLConnection
不能进行这个配置,相比较与NSURLConnection
依赖与一个全局的配置对象,缺乏灵活性而言,NSURLSession
有很大的改进了。(关于配置信息,后面会讲解到)