NSURLSession使用和AFURLSessionManager源码解析

一、简介 

一、NSURLRequest

NSURLRequest是个独立加载请求的解决方法,它封装了两个基本的元素:请求的URL和相关的缓存机制NSURLRequestCachePolicy

NSURLRequest中可以添加HTTP相关的各种首部字段例如HTTPMethod,Cookie,Content-Type等。

二、NSURLSession和NSURLSessionTask

NSURLSession: 使用者建立起的网络对话

NSURLSession使用和AFURLSessionManager源码解析_第1张图片

NSURLSessionConfiguration是NSURLSession的配置,可以统一配置NSURLSession一些设置。

NSURLSession和废弃的NSURLConnection的差异:

"NSURLConnection是全局性的,即它的配置对全局有效,如果有两个链接需要不同的cookies、证书这些公共资源,则NSURLConnection无法满足要求,这时NSURLSession的优势则体现出来,NSURLSession可以同过NSURLSessionConfiguration可以设置全局的网络访问属性。"

NSURLSessionTask: 一个具体的网络任务类,但它是一个抽象类,有许多的子类能实现不同的功能,每个子类也有不同的Delegate协议。

NSURLSessionDataTask其中一个子类,也是网络请求中最常用的请求之一。


NSURLSession使用和AFURLSessionManager源码解析_第2张图片

NSURLSessionDelegate: 系统有一个全局的NSURLSession单例,但是这样如果想要实现单独监控,就需要实例化单独的Session任务,并且通过NSURLSessionDelegate进行监听。


NSURLSession使用和AFURLSessionManager源码解析_第3张图片

二、AFNetworking中的AFURLSessionManager

它负责请求的建立、管理、销毁请求重启等各种功能。他主要实现了NSURLSession和NSURLSessionTask的封装。

AFNetworking中有开辟一条常驻线程请求网络数据。如果没有这条线程的话,就会每次请求网络就去开辟线程,完成之后销毁开辟线程,这样就造成资源的浪费,开辟一条常住线程,就可以避免这种浪费,我们可以在每次的网络请求都添加到这条线程。

(1)AFURLSessionManager内部拥有一个maxConcurrentOperationCount = 1的NSOperationQueue,用于运行本身私有的一个NSURLSessionConfiguration和NSURLSession。

这个私有的NSURLSession管理了一系列的NSURLSessionDataTask/NSURLSessionUploadTask/

NSURLSessionDownloadTask

(2) 当传入一个request时候,会用一个串行线程同步去创建task并赋予监听状态的delegate,并且让使用者可以去定义completion等handler,也可以实现重定向

NSURLSession使用和AFURLSessionManager源码解析_第4张图片

3) AFURLSessionManager对建立的每一个task都分配了响应的AFURLSessionManagerTaskDelegate,遵循了NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate三个protocol

每个task以task.id为key存储在一个dictionary中且使用lock来保证读写线程安全。

"AFURLSessionManagerTaskDelegate这个类主要是把NSURLSeesion的部分代理方法让他处理。从而达到简化代码的目的。"

如何解决session设置代理之后对代理对象的强引用问题?

(https://www.jianshu.com/p/5fd65c20912e)

NSURLSession对象在使用的时候,如果设置了代理,那么session对代理对象会保持一个强引用,在合适的时候应该主动进行释放

可以在控制器调用viewDidDisappear方法的时候来进行处理,可以通过调用invalidateAndCancel方法或者是finishTasksAndInvalidate方法来释放对代理对象的强引用

invalidateAndCancel方法直接取消请求然后释放代理对象,finishTasksAndInvalidate方法等请求完成之后释放代理对象。


NSURLSession使用和AFURLSessionManager源码解析_第5张图片

(4)使用信号量来控制异步的block中可以同步到获取不同类型的数组

NSURLSession使用和AFURLSessionManager源码解析_第6张图片

(5)让session可以归档解档,实现copy


NSURLSession使用和AFURLSessionManager源码解析_第7张图片

Reference: 

https://www.cnblogs.com/mddblog/p/5215453.html

https://www.cnblogs.com/HeiNeiKu/p/5628498.html

https://www.cnblogs.com/36bian/p/5237138.html

http://www.cocoachina.com/ios/20161018/17785.html

https://www.jianshu.com/p/e15592ce40ae

https://huang303513.github.io/2017/04/14/AFNetWorking%E6%BA%90%E7%A0%81%E4%B9%8BNSURLSession%E7%B3%BB%E5%88%97%E6%A6%82%E8%BF%B0.html

https://www.jianshu.com/p/5fd65c20912e

你可能感兴趣的:(NSURLSession使用和AFURLSessionManager源码解析)