簡述AFN(AFNetWorking 2.X)的實現分析和簡單使用【轉】

来源:http://www.cnblogs.com/axclogo/archive/2016/04/20/5413635.html
-Advertisement-
Play Games

【轉載】 Axc註:版本為AFNetWorking 2.6 3.0需要修改大部分對象 一:聲明本 人以前一直是使用ASI網路請求類庫的。最近才開始瞭解使用AFNetworing這個類庫。網上也肯定會有更好的介紹AFN的博客文章,希望大家辯證閱 讀,取之精華,去其糟粕。本人的認識可能有錯誤或者不全的地 ...


【轉載】

Axc註:版本為AFNetWorking 2.6    3.0需要修改大部分對象

一:聲明
本 人以前一直是使用ASI網路請求類庫的。最近才開始瞭解使用AFNetworing這個類庫。網上也肯定會有更好的介紹AFN的博客文章,希望大家辯證閱 讀,取之精華,去其糟粕。本人的認識可能有錯誤或者不全的地方,還請大家不吝指正。
博客源地址:http://386502324.blog.163.com/blog/static/1134693772015522115237696/

二:綜述
以下就是cocospod中AFNetworing除了幾個分類外的所有類。類庫的頭文件AFNetworking.h引入了下麵的所有類庫,並可以根據不同的系統使用不同的實現方式。下麵大體介紹下每個類的大致作用,主要以翻譯API的註釋文檔為主。

1:AFURLConnectionOperation
可以說是AFN最基礎的類。繼承自NSOperation類,將網路請求依附到一個operation上。從而讓我們能夠有效的控制並觀察一個網路請求的創建、進行、取消、完成、暫停恢復、異常等問題及狀態。【第三部分詳細分析實現以及功能】

2:AFHTTPRequestOperation
HTTP或HTTPS協議請求的AFURLConnectionOperation的子類。它封裝的可接受狀態碼和內容的類型,判定一個請求結果是成功或失敗。
實際上對系統的HTTP網路請求增加了幾個HTTP需要用到的參數。

3:AFHTTPRequestOperationManager
這個類是AFN類庫的核心類。它封裝完成了一種通用的模式,可以幫助我們輕鬆友好的完成請求的創建、響應的系列化,網路狀態的監控以及安全策略以及每一個請求operation的管理(operation的相互依賴或狀態改變)。
【第三部分詳細分析實現以及功能】

4:AFURLSessionManager
iOS7 之後,蘋果增加了新的網路請求類--NSURLSession。AFN官方推薦iOS 7 或者 Mac OS X 10.9以上的,最好使用該類發起網路請求,取代AFHTTPRequestOperationManager。不過基於目前國內app大都最低適配的 iOS6,該類的用途還不是太廣泛。NSURLSession的說明或者使用不再贅述。自行查看API文檔。以後有時間再加上該類的使用。

5: AFURLSessionManager
繼承自AFURLSessionManager。類似於1和2的關係。也是方便HTTP以及https請求的使用,增加了一些介面,方便調用。

6:AFNetworkReachabilityManager
網路的連通狀態監控以及網路的類型。實際是將蘋果官方提供的Reachability的類名和通知名更換了一下,防止和系統提供的類的通知名以及類名的衝突。

7:AFSecurityPolicy
這個我不太懂,安全策略的類。一般貌似用不到,有需要自行google。。

8:AFURLRequestSerialization
①:符合這個協議的對象用於處理請求,它將請求參數轉換為 query string 或是 entity body 的形式,並設置必要的 header。
②:構建multipart請求。

9:AFURLResponseSerialization
遵循AFURLResponseSerialization協議的對象,用於驗證、序列化響應及相關數據,轉換為有用的形式,比如 JSON 對象、圖像、甚至基於mantle的模型對象。

三:重點類的實現分析

1:AFURLConnectionOperation的實現

①:綜述
AFURLConnectionOperation 將Operation和URLConnection結合到一起,利用operation可以監聽到狀態以及可以建立相互之間的依賴關係的特性,實現了對於 一個NSURLConnection對象的完美控制,並將請求的結果通過block友好的返回。

②:實現文件.m
我們總結下.m中這個類主要有哪些方法。
1: 首先我們可以看到它創建了一個單例線程。這個線程將會常駐記憶體,用來處理AFN發起的所有請求任務。當然,線程也跟隨著一個runloop,AFN將這個 runloop的模式設置為NSDefaultRunLoopMode。NSDefaultRunLoopMode是無法檢測到connection的狀 態的。這說明瞭,AFN將不會在這該線程處理connection完成後的UI刷新等工作,而是會將數據拋給主線程,讓主線程去完成UI的刷新。
2:我們可以看到該類通過接受請求的字元串,創建了URLRequest以及NSURLConnection對象。從而去進行請求。
3:實現文件多次使用到了鎖,可以保證數據的安全。當然他也實現了幾個數據的NSCoping協議。
4:請求的創建、進行、取消、完成、暫停恢復、異常等問題及狀態的控制。這裡講一下暫停和恢復。
暫 停實際上將網路請求取消掉了。但是由於實現了nscoping協議,已經下載到數據得以保存下來。下次進行相同請求的時候,我們會將已經下載到的數據的節 點一起發送給伺服器,告訴伺服器這些部門的數據我們不需要了,伺服器根據我發送的返回節點給我返回相應的數據即可。從而實現了暫停和恢復功能,也就是斷點 續傳。
5:operation方法的重寫。自行google,這裡不贅述。
6:狀態的各種控制方法的實現以及發送狀態改變的通知

③:介面文件.h
介面文檔中的屬性方法,基本可以概括為以下幾個方法
1:只讀的數據,讓管理者可以接收到。
2:設置runloop的modes。不再使用類庫預設設置的defaultmodes。
3:狀態的控制方法
4:安全策略的設置
總而言之,介面文件.h暴露的介面都是為了讓manager可以去完全控制這個operation以及其中的網路請求。

2:AFHTTPRequestOperationManger

①:綜述
這個類可以說是整個類庫的核心類了。據說AFN2.0之前的時候,所有的網路請求相關的設置都雜糅到一個client中,導致client特別的臃腫。2.0後,AFN將一些設置提取出來,線程了專門的類【AFSecurityPolicy、AFURLRequestSerialization、AFURLResponseSerialization】。現在看來,AFN整體的設計是非常完美的。耦合性變得非常低,一些1.0版本中存在的問題也得到了改善。

②:實現文件.m
實現文件較為簡單,可以看到他創建了一個隊列。並將各個operation加入到隊列中。在隊列中,各個請求就可以設置依賴關係,併發的數量等等。

③:介面文件.h
介面文件中,我們可以看到。這個類可以設置AFSecurityPolicy、AFURLRequestSerialization、AFURLResponseSerialization 等參數了。這就是綜述所說的降低耦合性的方式。基本使用很簡單,這裡就不再贅述了。

四:補充
最近時間較為匆忙,人也有點墮落。寫的不是很詳細,以後還會繼續增加修改,補充一些7、8、9三個類的實現介紹。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • Do平臺的應用升級包含二種升級方式,一種是最常用的安裝包的升級,另外一種是應用內升級。很顯然第二種升級方式更靈活。 應用安裝包升級 原生應用通常的升級方式就是這種,比如android的安裝包是apk文件,ios的安裝包是ipa文件。如果要升級,只能重新下載一個新的apk/ipa文件,然後安裝覆蓋舊的 ...
  • 懶載入的定義: 所謂的懶載入可以定義為: 延時載入,即當對象需要用到的時候再去載入。其實就是所謂的重寫對象的get方法, 當系統或者開發者調用對象的get方法時,再去載入對象。 懶載入的優點: 1.不需將對象的實例化寫到viewDidLoad,可以簡化代碼,增強代碼的可讀性 2.對象的實例化在get ...
  • HashMap和SparseArray可以實現相似的功能。 但SparseArray是Android定義的,在鍵是整數時,他比HashMap的性能更高,因為HashMap使用的是Integer對象, 而SparseArray使用的是int型,因此使用HashMap會創建很多的Integer對象,而使 ...
  • 逐幀顯示一張圖片,連起來成為動畫 在res/drawable/目錄下,創建一個xxx.xml的文件 添加<animation-list>節點,設置是否迴圈android:oneshot:”false” 添加條目<item>節點,設置資源android:drawable=”@drawable/xxx” ...
  • 完成情況:瞭解as界面,以及基礎功能 制定個人模塊基本計劃 截圖及鏈接:運行helloworld:http://jingyan.baidu.com/album/90895e0fce970264ec6b0bf2.html?picindex=5 as入門知識介紹:http://blog.csdn.net ...
  • 說什麼都是蒼白的,直接上圖~ 在某些情況下,我們需要獲取用戶周邊的位置,來讓用戶選取。例如微信的朋友圈,在發一條朋友圈時可以選擇地點,就是使用這樣的功能。 基於以上的情況(其實也就是為了模仿微信),有了這個簡單的demo。 #-1 說明 其中使用了高德地圖的開發包,用了定位和搜索兩個模塊。demo中 ...
  • 今天主要學了幾個android控制項和使用兩個適配器 ListView DatePicker和TimePicker GridView 適配器:SimpleAdapter和ArrayAdapter 都是常見的控制項 學到現在就越來越發現,其實基本功打扎實了,學起這些很簡單,就是屬性和事件。 關於這些控制項有 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...