版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.03.05 |
前言
我们做APP发起网络请求,一般都是使用框架,这些框架的底层也都是苹果的API,接下来几篇就一起来看一下和网络有关的几个类。感兴趣的可以看上面几篇文章。
1. 详细解析几个和网络请求有关的类 (一) —— NSURLSession
2. 详细解析几个和网络请求有关的类(二) —— NSURLRequest和NSMutableURLRequest
3. 详细解析几个和网络请求有关的类(三) —— NSURLConnection
二者的生死关系
苹果以前的API是2.0 推出的NSURLConnection
,但是从iOS 7.0开始NSURLSession
开始使用,同时NSURLConnection
被弃用,比较典型的就是AFN这个框架的变化,也跟着完成了这个过渡。
NSURLSession相对于NSURLConnection来说,有很多优势。
- 后台上传和下载。
- 可以暂停和重启网络操作。
- 可以对缓存策略,session类型、任务类型(比如上传、下载等任务)进行单独的配置。
- 更多更丰富的代理模式。
NSURLSession
支持HTTP 2.0
普通任务、上传和下载任务
NSURLSession针对普通、上传和下载任务专门提供了特殊的类NSURLSessionDataTask
、NSURLSessionUploadTask
和NSURLSessionDownloadTask
进行处理。与NSURLConnection
相比更加的专业化。
1. 普通任务
当服务器返回的数据量较小的时候,NSURLSession
与NSURLConnection
执行普通任务的操作步骤没有区别。
2. 上传任务
都需要设置POST请求的请求体进行上传。
3. 下载任务
这个也是这两个类的最大区别。
NSURLConnection
下载文件时,使用异步回调先是将整个文件下载到内存,然后再写入到沙盒,如果文件比较大,就会出现内存暴涨的情况。并且,使用异步回调无法监听下载进度。NSURLSession
使用NSURLSessionUploadTask下载文件,会默认下载到沙盒中的tem
文件中,不会出现内存暴涨的情况,但是在下载完成后会把tem中的临时文件删除,需要在初始化任务方法时,在completionHandler
回调中增加保存文件的代码。
断点续传
NSURLConnection
进行断点下载,通过设置访问请求的HTTPHeaderField
的Range
属性,开启运行循环,NSURLConnection
的代理方法作为运行循环的事件源,接收到下载数据时代理方法就会持续调用,并使用NSOutputStream
管道流进行数据保存。NSURLSession
进行断点下载,当暂停下载任务后,如果downloadTask(下载任务)为非空,调用cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler
这个方法,这个方法接收一个参数,完成处理代码块,这个代码块有一个NSData参数resumeData
,如果resumeData非空,我们就保存这个对象到视图控制器的resumeData属性中,在点击再次下载时,通过调用[ [self.session downloadTaskWithResumeData:self.resumeData] resume]
方法进行继续下载操作。
请求方法的控制
-
NSURLConnection
实例化对象,实例化开始,默认请求就发送(同步发送),不需要调用start方法。而cancel
可以停止请求的发送,停止后不能继续访问,需要创建新的请求。 -
NSURLSession
有三个控制方法,取消(cancel)
、暂停(suspend)
、继续(resume)
,暂停以后可以通过继续恢复当前的请求任务。
Session的配置信息
NSURLSession
的构造方法(sessionWithConfiguration:delegate:delegateQueue)
中有一个NSURLSessionConfiguration
类的参数可以设置配置信息,其决定了cookie,安全和高速缓存策略,最大主机连接数,资源管理,网络超时等配置。NSURLConnection
不能进行这个配置,依赖与一个全局的配置对象,缺乏灵活性。
参考文章
1. NSURLSession与NSURLConnection区别
2. NSURLSession和NSURLConnection比较
3. NSURLSession 和 NSURLConnection的区别
后记
本篇的主要内容是
NSURLSession
和NSURLConnection
的区别,更多的是借鉴别人的总结文章加上自己的理解,参考的文章已经在后面列出来了。