AFNetworking 源码阅读
版本:AFNetworking 3.1.0
AFNetworking 主要的几个类或协议:
AFURLSessionManagerAFHTTPSessionManagerAFNetworkReachabilityManagerAFSecurityPolicy<AFURLRequestSerialization><AFURLResponseSerialization>

AFHTTPSessionManager
AFHTTPSessionManager 是我们使用 AFNetworking 框架最外层或者是可以直接使用的类,它对于框架核心类 AFURLSessionManager 进行了常用的封装。比如设置 BaseURL 和请求序列化,AFHTTPSessionManager 重要的两个属性:
1 | @property (readonly, nonatomic, strong, nullable) NSURL *baseURL; |
当发送一个 GET 请求时,框架会依次调用以下三个方法:
1 | [AFHTTPSessionManager GET:parameters:progress:success:failure:]` |
第一个方法是 AFHTTPSessionManager 对 GET、POST、PUT、PATCH、DELETE 等请求做的一个封装,它们的区别就是请求方法的不同,不同的请求会传入不同的参数给第二个方法,在第二个方法中会对传入的参数进行序列化。具体的序列化方法可以查看 AFHTTPRequestSerializer。然后会把序列化之后的 NSMutableURLRequest 作为参数调用第三方方法,这时就进入了框架的核心类: AFURLSessionManager。
AFURLSessionManager
AFURLSessionManager 持有一个 NSURLSession 类型的 session 属性,并作为该属性的 delegate,遵守实现了 NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate 四个代理方法,如果任何子类继承重写这些方法,都必须先调用父类的实现。
initWithSessionConfiguration: 是 AFURLSessionManager 的指定初始化方法,并且在session 初始化指定为其的代理:
1 | self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue]; |
这样的话当一个网络请求的数据有返回或者状态被更改的时候,可以在代理方法中及时获知。AFURLSessionManager 的 session 属性可能会实例化多个 NSURLSessionDataTask 对象,但是 AFURLSessionManager 并不会直接维护它们,而是通过一个可变字典以 task.taskIdentifier 为 key 保存一个私有类 AFURLSessionManagerTaskDelegate 的实例,这个实例会保存这次网络请求的回调、响应数据和进度,两者是一对一的关系。当 AFURLSessionManager 所实现的协议方法被调用时,会及时更新 AFURLSessionManagerTaskDelegate 实例的数据。
在实现文件中,框架还对 NSURLSessionDataTask 的 resume 和 suspend 方法进行了 Hook,在方法执行的时候发送通知。
除此之外,AFURLSessionManager 还管理者 AFSecurityPolicy 和 AFNetworkReachabilityManager,来保证请求的安全和查看网络连接情况,它有一个 AFJSONResponseSerializer 的实例来序列化 HTTP 响应。
AFURLRequestSerialization 和 AFURLResponseSerialization
<AFURLRequestSerialization> 和 <AFURLResponseSerialization> 只是两个协议,并且分别只有一个方法。
1 | @protocol AFURLRequestSerialization <NSObject, NSSecureCoding, NSCopying> |
实现 <AFURLRequestSerialization> 协议的有 AFHTTPRequestSerializer 及其两个子类: AFJSONRequestSerializer 和 AFPropertyListRequestSerializer,AFHTTPRequestSerializer除了实现协议之外还封装了对 TTPHeader 和 HTTPBody 操作。
实现 <AFURLResponseSerialization> 协议的有 AFHTTPResponseSerializer 及AFJSONResponseSerializer 等数个子类。
AFHTTPResponseSerializer 有两个属性分来判断接受的 StatusCode 和 ContentType:
1 | @property (nonatomic, copy, nullable) NSIndexSet *acceptableStatusCodes; |
而 AFJSONResponseSerializer 是 AFHTTPSessionManager 类默认的响应序列化类型。
AFNetworkReachabilityManager
AFNetworkReachabilityManager 作用是监听网络,是一个比较独立的模块,可以拿出来单独使用。
指定构造方法: initWithReachability:,AFNetworkReachabilityManager 会持有这个 SCNetworkReachabilityRef 属性。
调用 startMonitoring 开始监听:
1 | - (void)startMonitoring { |