首先请参照源码阅读
URLSesionManager,顾名思义,AFURLSessionManager是对NSURLSession 进行处理的一个管理工具。
先来看看AFURLSessionManager.m 的结构
@interface AFURLSessionManagerTaskDelegate: NSObject <NSURLSessionTaskDelegate,NSURLSessionDataDelegate,NSURLSessionDownloadDelegate>
@end
@implementation AFURLSessionManagerTaskDelegate
@end@interface _AFURLSessionTaskSwizzling : NSObject
@end
@implementation _AFURLSessionTaskSwizzling
@end@interface AFURLSessionManager ()
@end@implementation AFURLSessionManager
@end
这些内部类都做了什么?
AFURLSessionManagerTaskDelegate 作用是处理NSURLSessionTask对网络请求响应,实现了数据拼接,progress回调,响应的序列化等功能。
_AFURLSessionTaskSwizzling 利用Runtime为NSURLSessionTask的suspend和resume方法添加消息广播功能
AFURLSessionManager 重点看这两个地方
dataTaskWithRequest方法 addDelegateDorDataTask 方法dataTaskWithRequest:
子类AFHTTPSessionManager封装的GET、POST、DELETE、PUT等网络请求方法最终都会走到dataTaskWithHTTPMethod,然后进入dataTaskWithRequest,也就是说dataTaskWithRequest是发起网络请求的入口。dataTaskWithRequest方法中 728 行就是NSURLSession对象创建一个DataTask,由DataTask发起网络请求任务
addDelegateForDataTask: 和 setDelegatte:forTask
将dataTask 与 AFURLSessionManagerTaskDelegate对象绑定。这就是AFURLSessionManager的核心,让每一个dataTask有专门的delegate去处理自己的网络响应避免线程安全和资源抢夺问题。
要注意,NSURLSession的delegate仍然是AFURLSessionManager,并不是AFURLSessionManagerTaskDelegate,
例如:
当数据接收到数据时,NSURLSession回调SessionManager实现的代理方法didReceiveResponse,SessionManager再通过task找出对应的taskDelegate来处理数据。
也就是说,SessionManager只负责将所有的网络响应转发给taskdelegate,只管理task和taskDelegate的对应关系,并不实际处理数据。
网友评论