AF分为5个功能模块:
网络通信模块(AFHTTPSessionManager/AFURLSessionManager)
网络状态监听模块(AFURLResponseSerialization)
网络通信安全策略模块(AFSecurityPolicy)
网络通信信息序列化/反序列模块(AFURLRequestSerialization/AFURLResponseSerialization)
其核心当然是网络通信模块AFURLSessionManager
AFHTTPSessionManager继承于AFURLSessionManager.在初始化的时候- (instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration的时候直接调用父类AFURLSessionManager的initWithSessionConfiguration的方法.
AFHTTPSessionManager的初始化
接下来是AFURLSessionManager的初始化
NSURLSession的有关api,我之前已经总结过了,这里是加了锁
至此AFURLSessionManager初始化完成了,接下来是网络请求.
举个GET请求的例子 从AFHTTPSessionManager开始
接着在AFURLRequestSerialization里面来获取NSMutableURLRequest的请求,请求类型get,post,put等
AFHTTPRequestSerializerObservedKeyPaths()这个c函数返回一数组,里面包含了NSMutableURLRequest的各种属性
在AFURLRequestSerialization里面的init初始化mutableObservedChangedKeyPaths这个NSSet方法,并添加观察者利用kVO模式进行监听.
KVO触发方法:
接下来是将传入的parameters进行编码,并添加到request
其实解码里面最重要的就是AFQueryStringPairsFromKeyAndValue()方法,通过判断value的类型(array,dic,set),不断递归自己,最后返回一数组
其中AFQueryStringPair这个对象的实现
如果GET/HEAD/DELETE,是把参数拼接到url后面的,而POST/PUT是把query拼接到http body中.
至此生成了一个request.
参考:https://www.jianshu.com/p/856f0e26279d