標籤:沒有 通過 安全 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的大體思路