1. 程式人生 > >iOS總結-網路框架-AFNetworking原始碼解析(一)

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