AFURLSessionManager

2019-08-29  本文已影响0人  Deskpd

首先请参照源码阅读

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的对应关系,并不实际处理数据。

上一篇 下一篇

猜你喜欢

热点阅读