AFNetworking 網絡庫

源碼閱讀學習:
參考源碼解讀:http://www.lxweimin.com/p/c36159094e24
底層原理分析:

  • AFNetWorking是對NSURLSession的封裝
  • AFHTTPRequestOperationManager :內部封裝的是 NSUrlConnection,負責發送網絡請求,使用最多的一個類.(3.0廢棄)
  • AFHTTPSessionManager :內部封裝是 NSUrlSession ,負責發送網絡請求,使用最多的一個類.
  • AFHTTPRequestOperationManager 和 AFHTTPSessionManager :定義的 API(方法名稱)是一模一樣,沒有任何區別.
  • AFNetworkReachabilityManager :實時監測網絡狀態的工具類.當前的網絡環境發生改變之后,這個工具類就可以檢測到.
  • AFSecurityPolicy :網絡安全的工具類, 主要是針對 HTTPS 服務.
  • AFURLRequestSerialization :序列化工具類,基類.上傳的數據轉換成JSON格式(AFJSONRequestSerializer).使用不多.
  • AFURLResponseSerialization :反序列化工具類;基類.使用比較多:
    AFJSONResponseSerializer; JSON解析器,默認的解析器.
  • AFHTTPResponseSerializer; 萬能解析器; JSON和XML之外的數據類型,直接返回二進制數據.對服務器返回的數據不做任何處理.
    AFXMLParserResponseSerializer; XML解析器;

AFM默認超時時長是:60秒

斷點續傳:

  • 檢查服務器文件信息
  • 檢查本地文件
  • 如果本地比服務器文件小,斷點續傳,利用HTTP請求頭的Range實現斷點續傳
  • 如果比服務器文件大,重新下載
  • 大小一致,下載完成

文檔參考

AFNetworking Docs
Apple - URL Session Programming Guide

由 NSURLConnection 轉為 NSURLSession 了;
使用 session task 來進行數據請求;

代碼結構

Paste_Image.png
  • AFHTTPSessionManager :AFURLSessionManager
    默認使用request與response的序列化方式是: HTTP Serializer與JSON Serializer,用于在POST multipart時候使用;//發送及接收數據前的處理;
    是對NSURLSession的封裝處理,提供設置回調函數接口;
    處理session的delegate,處理session task的delegate;
    how to use AFHTTPSessionManager?
    GET --> create NSURLSessionDataTask -> dataTask resume

  • SecurityPolicy
    AFSecurityPolicy evaluates server trust against pinned X.509 certificates and public keys over secure connections.
    使用 Security系統庫
    用于HTTPS的secure連接請求;
    判斷請求的證書是否可信;分為 證書/公鑰 兩種:
    AFSSLPinningModePublicKey 、AFSSLPinningModeCertificate
    evaluateServerTrust 流程:
    讀取本地公鑰的key文件;
    提取pulickey 或者 certificate 信息;
    檢查域名有效,創建policy,檢測server是否值得信任;
    如果是None模式:檢測證書可信性;
    如果是證書模式:檢測證書是否與設置過的相匹配;
    如果是公鑰模式:提取發送過來的公鑰,檢查是否與本地的key有相同的,如果有相同就返回YES;
    --> 驗證證書成功后,URLSession會使用證書進行下一步通信處理;

  • Reachability
    是對系統SystemConfiguration庫中的SCNetWorkReachability的封裝;
    提供監聽網絡狀態,判斷網絡是否連接的接口;
    設計:將網絡狀態轉換為wifi與wwan兩種形式,并對網絡變化提供消息通知處理;
    在main loop中,schedule一個任務,用于網絡狀態監控;
    網絡狀態變化,發送通知消息;
    區分ipv4/ipv6的參數創建;

  • Request/Response Serializer
    根據不同子類的serializer實現,對請求數據進行重新組織,行程字典格式或者json格式等參數內容;
    對請求數據進行處理,編碼
    對請求的header及類型等http信息就行處理
    multipart請求的處理(要上傳文件需要使用)
    Response serializer對返回數據進行解析(JSON/XML/PropertyList/Image/Compound)處理,檢查有效性并提取數據進行分裝;

  • example 示例 使用結構設計:
    model模塊,負責請求及處理數據
    controller模塊,負責控制view顯示數據及協議實現,用戶交互
    view模塊,負責顯示數據

  • UIWebView+AFNetworking
    UIWebView 類別,使用了runtime
    一個運行時屬性變量,使用了objc_set/getAssociateObject對屬性進行讀寫;
    一個session manager屬性變量,也使用運行時函數進行讀寫;//使用了dispatch_once創建靜態變量
    二個load request函數
    __weak __typeof(self) weakSelf = self;
    session請求的返回及狀態進度都是用代理模式處理;
    每一個session task對應一個delegate;

  • get 請求流程
    使用request serializer創建一個NSMutableURLRequest(設置NSURLRequest的參數及header,httpbody信息);
    使用NSURLRequest創建一個NSURLSessionDataTask(創建一個session task,設置delegate函數實現,根據task的identify存儲對應的delegate對象);
    處理NSURLSession相關的delegate函數,調用task對應的代理對象對返回數據、錯誤、進度等信息進行回調處理;

  • data task 創建流程
    POST data task:

  1. 使用request searializer 創建post的 NSURLRequest;
  2. NSURLSession 調用 uploadTaskWithStreamedRequest 創建 NSURLSessionUploadTask;
  3. 給task添加對應的delegate并存到到字典中,用于task狀態返回的處理;
  4. task resume 開始執行task;
  • NSURLSesssion task種類
    data task:
    upload task:
    download task:

  • 后臺下載機制如何使用?
    當應用退出后,崩潰或者進程被關掉還是會運行;
    使用后臺session配置,[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier];
    在NSURLSessionDownloadDelegate的didFinsh函數中,移動臨時目錄文件到應用的存儲中;

使用相關技術

單例 dispatch_once
Core Foundation 使用,需要手動retain與release管理;
background task
runtime method swizzle
NSOperationQueue
遞歸鎖 NSRecursiveLock
信號量 dispatch_semphore_t (signal +1, wait -1);
手動調用KVO通知,KVO的依賴
消息通知

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容