IOS 開發 網路詳解(四)--- AF的大體思路

來源:互聯網
上載者:User

標籤:沒有   通過   安全   hand   實用   cached   with   調用   timeout   

AF的大體思路

1.NSURLConnection + NSOperation

NSURLConnection + NSOperationNSURLConnection 是 Foundation URL 載入系統的基石。一個 NSURLConnection 非同步地載入一個 NSURLRequest 對象,調用 delegate 的 NSURLResponse / NSHTTPURLResponse 方法,
其 NSData 被發送到伺服器或從伺服器讀取;delegate 還可用來處理 NSURLAuthenticationChallenge、重新導向響應、或是決定 NSCachedURLResponse 如何儲存在共用的 NSURLCache 上。NSOperation 是抽象類別,類比單個計算單元,有狀態、優先順序、依賴等功能,可以取消。AFNetworking 的第一個重大突破就是將兩者結合。AFURLConnectionOperation 作為 NSOperation 的子類,遵循 NSURLConnectionDelegate 的方法,可以從頭到尾監視請求的狀態,並儲存請求、響應、響應資料等中間狀態。

 

2.使用Block

iOS 4 引入的 block 和 Grand Central Dispatch 從根本上改善了應用程式的開發過程。相比於在應用中用 delegate 亂七八糟地實現邏輯,開發人員們可以用 block 將相關的功能放在一起。GCD 能夠輕易來回調度工作,不用面對亂七八糟的線程、調用和操作隊列。更重要的是,對於每個 request operation,可以通過 block 自訂 NSURLConnectionDelegate 的方法(比如,通過 setWillSendRequestForAuthenticationChallengeBlock: 可以覆蓋預設的 connection:willSendRequestForAuthenticationChallenge: 方法)。現在,我們可以建立 AFURLConnectionOperation 並把它安排進 NSOperationQueue,通過設定 NSOperation 的新屬性 completionBlock,指定操作完成時如何處理 response 和 response data(或是請求過程中遇到的錯誤)。

 

3.序列化&驗證

更深入一些,request operation 操作也可以負責驗證 HTTP 狀態代碼和伺服器響應的內容類型,比如,對於 application/json MIME 類型的響應,可以將 NSData 序列化為 JSON 對象。從伺服器載入 JSON、XML、property list 或者映像可以抽象並類比成潛在的檔案載入操作,這樣開發人員可以將這個過程想象成一個 promise 而不是非同步網路連接。

 

4.AF2.的改善1.相容 NSURLSession 

NSURLSession 是 iOS 7 新引入的用於替代 NSURLConnection 的類。NSURLConnection 並沒有被棄用,今後一段時間應該也不會,但是 NSURLSession 
是 Foundation 中網路的未來,並且是一個美好的未來,因為它改進了之前的很多缺點。(參考 WWDC 2013 Session 705 “What’s New in Foundation Networking”,一個很好的概述)。
起初有人推測,NSURLSession 的出現將使 AFNetworking 不再有用。但實際上,雖然它們有一些重疊,AFNetworking 還是可以提供更高層次的抽象。AFNetworking 2.0 不僅做到了這一點,
還藉助並擴充 NSURLSession 來鋪平道路上的坑窪,並最大程度擴充了它的實用性。2.模組化
對於 AFNetworking 的主要批評之一是笨重。雖然它的構架使在類的層面上是模組化的,但它的封裝並不允許選擇獨立的一些功能。隨著時間的推移,AFHTTPClient 尤其變得不堪重負
(其任務包括建立請求、序列化 query string 參數、確定響應解析行為、產生和管理 operation、監視網路可達性)。 在 AFNetworking 2.0 中,你可以挑選並通過 CocoaPods subspecs
選擇你所需要的組件。

 

5.演員陣容

NSURLConnection 組件 (iOS 6 & 7)AFURLConnectionOperation - NSOperation 的子類,負責管理 NSURLConnection 並且實現其 delegate 方法。AFHTTPRequestOperation - AFURLConnectionOperation 的子類,用於產生 HTTP 要求,可以區別可接受的和不可接受的狀態代碼及內容類型。2.0 版本中的最大區別是,
你可以直接使用這個類,而不用繼承它,原因可以在“序列化”一節中找到。AFHTTPRequestOperationManager - 封裝常見 HTTP web 服務作業的類,通過 AFHTTPRequestOperation 由 NSURLConnection 支援。
NSURLSession 組件 (iOS 7)AFURLSessionManager - 建立、管理基於 NSURLSessionConfiguration 對象的 NSURLSession 對象的類,也可以管理 session 的資料、下載/上傳任務,實現 sessio
和其相關聯的任務的 delegate 方法。因為 NSURLSession API 設計中奇怪的空缺,任何和 NSURLSession 相關的代碼都可以用 AFURLSessionManager 改善。AFHTTPSessionManager - AFURLSessionManager 的子類,封裝常見的 HTTP web 服務作業,通過 AFURLSessionManager 由 NSURLSession 支援。

 

總的來說:為了支援新的 NSURLSession API 以及舊的未棄用且還有用的 NSURLConnection,AFNetworking 2.0 的核心組件分成了 request operation 和 session 任務。
AFHTTPRequestOperationManager 和 AFHTTPSessionManager 提供類似的功能,在需要的時候(比如在 iOS 6 和 7 之間轉換),它們的介面可以相對容易的互換。之前所有綁定在 AFHTTPClient的功能,比如序列化、安全性、可達性,被拆分成幾個獨立的模組,可被基於 NSURLSession 和 NSURLConnection 的 API 使用。

 

6.序列化

AFNetworking 2.0 新構架的突破之一是使用序列化來建立請求、解析響應。可以通過序列化的靈活設計將更多商務邏輯轉移到網路層,並更容易定製之前內建的預設行為。

<AFURLRequestSerializer> - 符合這個協議的對象用於處理請求,它將請求參數轉換為 query string 或是 entity body 的形式,並設定必要的 header。那些不喜歡
AFHTTPClient 使用 query string 編碼參數的傢伙,你們一定喜歡這個。<AFURLResponseSerializer> - 符合這個協議的對象用於驗證、序列化響應及相關資料,轉換為有用的形式,比如 JSON 對象、映像、甚至基於 Mantle 的模型對象。相比沒
完沒了地繼承 AFHTTPClient,現在 AFHTTPRequestOperation 有一個
responseSerializer 屬性,用於設定合適的
handler。同樣的,再也沒有沒用的受 NSURLProtocol 啟發的 request operation 類註冊,取而代之的還是很棒的 responseSerializer 屬性。謝天謝地。

 

7.安全性

感謝 Dustin Barker、Oliver Letterer、Kevin Harwood 等人做出的貢獻,AFNetworking 現在帶有內建的 SSL pinning 支援,這對於處理敏感資訊的應用是十分重要的。AFSecurityPolicy - 評估伺服器對安全連線針對指定的固定認證或公用密鑰的信任。tl;dr 將你的伺服器憑證添加到 app bundle,以協助防止 中間人攻擊。

 

8.可達性

從 AFHTTPClient 解藕的另一個功能是網路可達性。現在你可以直接使用它,或者使用 AFHTTPRequestOperationManager / AFHTTPSessionManager 的屬性。AFNetworkReachabilityManager - 這個類監控當前網路的可達性,提供回調 block 和 notificaiton,在可達性變化時調用。

 

9.UIKit擴充

之前 AFNetworking 中的所有 UIKit category 都被保留並增強,還增加了一些新的 category。AFNetworkActivityIndicatorManager:在請求操作開始、停止載入時,自動開始、停止狀態列上的網路活動指示表徵圖。UIImageView+AFNetworking:增加了 imageResponseSerializer 屬性,可以輕鬆地讓遠程載入到 image view 上的映像自動調整大小或應用濾鏡。比如,
AFCoreImageSerializer 可以在 response 的映像顯示之前應用 Core Image filter。UIButton+AFNetworking (新):與 UIImageView+AFNetworking 類似,從遠端資源載入 image 和 backgroundImage。UIActivityIndicatorView+AFNetworking (新):根據指定的請求操作和會話任務的狀態自動開始、停止 UIActivityIndicatorView。UIProgressView+AFNetworking (新):自動跟蹤某個請求或會話任務的上傳/下載進度。UIWebView+AFNetworking (新): 為載入 URL 請求提供了更強大的API,支援進度回調和內容轉換。

 

10 OperationManager和SesstionManager的使用

 

AFHTTPRequestOperationManager *manager =    [[AFHTTPRequestOperationManager alloc]init];    //佈建要求逾時    manager.requestSerializer.timeoutInterval = 10.0f;    //聲明返回的結果是json 類型    manager.responseSerializer = [AFJSONResponseSerializer serializer];    //聲明請求的資料是json 類型    manager.requestSerializer = [AFJSONRequestSerializer serializer];    //請求接收不一致,替換text/html 或別的    manager.responseSerializer.acceptableContentTypes = [NSSet  setWithObjects:@"text/html", nil];    [manager GET:url parameters:params success:^(AFHTTPRequestOperation     *operation, id responseObject) {        //請求成功        success(responseObject);} failure:^(AFHTTPRequestOperation *operation, NSError *error) {    //錯誤資訊    failure(error);}];

 

 

    AFHTTPSessionManager *httpSessionManager =[AFHTTPSessionManager manager];    httpSessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];    NSURLSessionDataTask *task = [httpSessionManager GET:@"http://www.com" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject)    {    } failure:^(NSURLSessionDataTask *task, NSError *error)    {         }];

 

IOS 開發 網路詳解(四)--- AF的大體思路

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.