https://juejin.im/entry/5bf626b2f265da614e2bb7dd
一、架构
AFNetworking 一共分为 5 个模块,2 个核心模块和 3 个辅助模块:
- Core
- NSURLSession(网络通信模块)
- AFURLSessionManager(封装 NSURLSession)
- AFHTTPSessionManager(继承自 AFURLSessionManager,实现了 HTTP 请求相关的配置)
- Serialization
- AFURLRequestSerialization(请求参数序列化)
- AFHTTPRequestSerializer
- AFJSONRequestSerializer
- AFPropertyListRequestSerializer
- AFURLResponseSerialization(验证返回数据和反序列化)
- AFHTTPResponseSerializer
- AFJSONResponseSerializer
- AFXMLParserResponseSerializer
- AFXMLDocumentResponseSerializer (Mac OS X)
- AFPropertyListResponseSerializer
- AFImageResponseSerializer
- AFCompoundResponseSerializer
- AFURLRequestSerialization(请求参数序列化)
- NSURLSession(网络通信模块)
- Additional Functionality
- Security(网络通信安全策略模块)
- Reachability(网络状态监听模块)
- UIKit(对 iOS 系统 UI 控件的扩展)
AFURLSessionManager 是 AFHTTPSessionManager 的父类, AFURLSessionManager 负责创建和管理 NSURLSession 的实例,管理 AFSecurityPolicy 和初始化 AFNetworkReachabilityManager,来保证请求的安全和查看网络连接情况,它有一个 AFJSONResponseSerializer 的实例来序列化 HTTP 响应。
AFHTTPSessionManager 有着自己的 AFHTTPRequestSerializer 和 AFJSONResponseSerializer 来管理请求和响应的序列化,同时依赖父类实现发出 HTTP 请求、管理 Session 这一核心功能。
1. 线程
一般调用 AFNetworking 的请求 API 时,都是在主线程,也是主队列。然后直到调用 NSURLSession 的 -resume
方法,一直都是在主线程。
在 AFURLSessionManager 的初始化方法中,设置了 NSURLSession 代理回调线程的最大并发数为 1,因为就像 NSURLSession 的 -sessionWithConfiguration:delegate:delegateQueue:
方法的官方文档中所说的那样,所有的代理方法回调都应该在一个串行队列中,因为只有这样才能保证代理方法的回调顺序。
NSURLSession 代理方法回调是异步的,所以收到回调时的线程模式是“异步+串行队列”,这个时候可以理解为处于回调线程。
收到代理回调后,接着在 AFURLSessionManagerTaskDelegate 的 -URLSession:task:didCompleteWithError:
方法中,异步切换到 processing queue 进行数据解析,数据解析完成后再异步回到主队列或者自定义队列。