ios网络篇

NSURLSession篇


ios网络篇_第1张图片
NSURLSession关系

NSURLSession:

NSURLSession由三个基本模块构成:

NSURLSession

NSURLSessionConfiguation

NSURLSessionTask

NSURLSession相对于平时通信中的会话,但本身却不会进行网络数据传输,它会穿件多个NSURLSessionTask去执行每次的网络请求

NSURLSession的行为取决于三个方面。包括NSURLSession的类型、NSURLSessionTask的类型和在创建task时APP是否处于前端

NSURLSession有三种类型

defaultSession将cache和creditials储存于本地

Ephemeral Session对数据更加保密安全,并不会向本地储存任何数据,将cache和creditials储存在内存中,并和Session绑定,当Session销毁时,对应的数据也会被销毁。

backgroundSession可以时APP处于后台时继续数据传输,其行为与defaultSession类似,但是所有的数据传输均由一个非本APP的进程来管理。也有一些功能上的限制。

在创建Session对象时通过NSURLSessionConfigration来配置,可设置Session的delegate

Session一但配置完成,就不能修改,除非创建一个新的Session对象。

NSURLSessionTask包括三种Task类型,分别为:NSURLSessionDataTask,NSURLSessionDownLoadTask,NSURLSessionUploadTask

所有的Task状态都是暂停的,需要用[Task resume]启动Task

NSURLSession有两种获取数据的方式:

初始化session时指定delegate,在代理方法中返回数据,需要实现NSURLSession的两个代理方法

初始化Session时未指定delegate的,通过block回调返回数据。

NSURLSession对象的销毁,有两种销毁模式:

- (void)invalidateAndCancel 取消该Session中的所有Task,销毁所有delegate、block和Session自身,调用后Session不能再复用。

- (void)finishTasksAndInvalidate 会立即返回,但不会取消已启动的task,而是当这些task完成时,调用delegate

这里有个地方需要注意,即:NSURLSession对象对其delegate都是强引用的,只有当Session对象invalidate, 才会释放delegate,否则会出现memory leak。

使用Session加速网络访问速度,使用同一个Session中的task访问数据,不用每次都实现三次握手,复用之前服务器和客户端之间的网络链接,从而加快访问速度。


NSURLRequestCachePolicy:缓存策略

NSURLRequestUseProtocolCachePolicy: 对特定的 URL 请求使用网络协议中实现的缓存逻辑。这是默认的策略。

NSURLRequestReloadIgnoringLocalCacheData:数据需要从原始地址加载。不使用现有缓存。

NSURLRequestReloadIgnoringLocalAndRemoteCacheData:不仅忽略本地缓存,同时也忽略代理服务器或其他中间介质目前已有的、协议允许的缓存。

NSURLRequestReturnCacheDataElseLoad:无论缓存是否过期,先使用本地缓存数据。如果缓存中没有请求所对应的数据,那么从原始地址加载数据。

NSURLRequestReturnCacheDataDontLoad:无论缓存是否过期,先使用本地缓存数据。如果缓存中没有请求所对应的数据,那么放弃从原始地址加载数据,请求视为失败(即:“离线”模式)。

NSURLRequestReloadRevalidatingCacheData:从原始地址确认缓存数据的合法性后,缓存数据就可以使用,否则从原始地址加载。

NSURLConnect和NSURLSession的区别:

1.请求方法的控制

NSURLConnection实例化对象,实例化开始,默认请求就发送(同步发送),不需要调用start方法。而cancel 可以停止请求的发送,停止后不能继续访问,需要创建新的请求。

NSURLSession有三个控制方法,取消(cancel),暂停(suspend),继续(resume),暂停后可以通过继续恢复当前的请求任务。

2.配置信息

NSURLSession的构造方法(sessionWithConfiguration:delegate:delegateQueue)中有一个 NSURLSessionConfiguration类的参数可以设置配置信息,其决定了cookie,安全和高速缓存策略,最大主机连接数,资源管理,网络超时等配置。NSURLConnection不能进行这个配置,相比于 NSURLConnection 依赖于一个全局的配置对象,缺乏灵活性而言,NSURLSession 有很大的改进了。

3.断点续传的方式

NSURLConnection进行断点下载,通过设置访问请求的HTTPHeaderField的Range属性,开启运行循环,NSURLConnection的代理方法作为运行循环的事件源,接收到下载数据时代理方法就会持续调用,并使用NSOutputStream管道流进行数据保存。

NSURLSession进行断点下载,当暂停下载任务后,如果 downloadTask (下载任务)为非空,调用 cancelByProducingResumeData:(void (^)(NSData*resumeData))completionHandler这个方法,这个方法接收一个参数,完成处理代码块,这个代码块有一个 NSData 参数 resumeData,如果 resumeData 非空,我们就保存这个对象到视图控制器的 resumeData 属性中。在点击再次下载时,通过调用 [ [self.session downloadTaskWithResumeData:self.resumeData]resume]方法进行继续下载操作。

经过以上比较可以发现,使用NSURLSession进行断点下载更加便捷。

4.下载任务方式

NSURLConnection下载文件时,先将整个文件下载到内存,然后再写入沙盒,如果文件比较大,就会出现内存暴涨的情况。而使用NSURLSessionDownloadTask下载文件,会默认下载到沙盒中的tem文件夹中,不会出现内存暴涨的情况,但在下载完成后会将tem中的临时文件删除,需要在初始化任务方法时,在completionHandler回调中增加保存文件的代码。

5.使用现状

NSURLSession是NSURLConnection 的替代者,在2013年苹果全球开发者大会(WWDC2013)随ios7一起发布,是对NSURLConnection进行了重构优化后的新的网络访问接口。从iOS9.0开始, NSURLConnection中发送请求的两个方法已过期(同步请求,异步请求),初始化网络连接(initWithRequest: delegate:)的方法也被设置为过期,系统不再推荐使用,建议使用NSURLSession发送网络请求

你可能感兴趣的:(ios网络篇)