iOS總結-網路框架-AFNetworking原始碼解析(一)
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