淺析MKNetworkKit
便捷目錄
一、MKNetworkKit簡介
1.1 簡介:
1.2 特點:
二、MKNetworkKit基本用法
2.1 添加(導入)MKNetworkKit
2.2 具體用法舉例
三、AFNetworking、MKNetworkKit和ASIHTTPRequest對比
四、總結
4.1 使用MKNetworkKit時應該按照如下順序執行
4.2 MKNetworkOperation中的便捷方法
4.3 細節注意
一、MKNetworkKit簡介
1.1 簡介:
MKNetworkKit是一個由Objective-C語言編寫的用來實現網絡請求的第三方框架,支持塊(block)和ARC,且用法簡單。
MKNetworkKit集ASIHTTPRequest 和 AFNetworking 兩個框架於一體。在集成二者的優秀特性之外,還增加了一堆新的功能。尤其是,相比於其它框架,它更易於使用且極爲高效。
1.2 特點:
1、超輕量級框架
整個框架只有2個類和一些類別方法。因此,它的使用極其簡單。
MKNetworkKit的類
1)MKNetworkOperation
2)MKNetworkEngine
3)一些工具類(Apple的Reachability)以及類別
對於MKNetworkKit,你所需要了解的就是暴露在兩個類MKNetworkOperation和 MKNetworkEngine中的方法。MKNetworkOperation就好比ASIHttpRequest類。它是一個NSOperation子類,封裝了你的request和response類。對於每個網絡操作,你需要創建一個MKNetworkOperation。
MKNetworkEngine是一個僞單例類,管理程序中的網絡隊列。它是僞單例的,也就是說,對於簡單請求,你可以直接用MKNetworkEngine中的方法。要進行深度的定製,你應該進行子類化。每個MKNetworkEngine子類有它自己的Reachability對象,用於通知它來自服務器的reachability通知。對於不同的REST服務器,你可以考慮創建單獨的MKNetworkEngine子類。
它是僞單例,它的子類的每個請求都共用唯一的一個隊列。你可以在應用程序委託中retain這個MKNetworkEngine,就像CoreData的managedObjectContext 類一樣。在使用MKNetworkKit時,創建一個MKNetworkEngine子類將你的網絡請求進行邏輯上的分組。例如,將所有關於Yahoo的方法放在一個類,所有Facebook有關的方法放進另一個類。來看3個實際使用的例子。
2、在整個程序中只有一個全局隊列
高度依賴互聯網連接的app應該優先考慮網絡線程的併發數。不幸的是,沒有任何網絡框架在這方面做得夠好。因此,一旦你在程序中沒有控制好網絡線程的併發數,就極易導致出錯。
假設你要上傳一堆圖片到服務器上。絕大多數移動網絡(3G)不會允許你對同一個IP 地址的 HTTP 併發連接數超過 2 個。換句話說,在設備上,你不能從 3G 網絡中獲得 2 個以上的 HTTP 併發連接。對於 Edge 則更糟,大多數情況不能超過1 個。相比較家用寬帶網絡(Wifi),則這個限制要寬得多(6 個)。但是,你不可能總是使用 wifi,你必須也考慮到有限網絡(窄帶)的連通性。更多的時候,iDevice設備幾乎都能連接到 3G 網絡,因此,你同時只能上傳 2 張圖片。但是,真正的問題不是緩慢的上傳速度,而是另一種情況。在你打開一個 view 試圖加載縮略圖(不同的view)時,上傳線程被運行到後臺。如果你沒有控制好上傳隊列中的線程數,你的縮略圖會加載超時。這是不正常的。正確的方式是優化縮略圖加載線程,或者讓線程等待直到上傳完成再加載縮略圖。這需要你在整個程序中只擁有一個queue 隊列。
MKNetworkKit在它的每個實例中使用單例來保證這一點。並不是說MKNetworkKit是單例的,而是說它的共享隊列是單例的。
3、正確顯示網絡狀態指示
許多第三方框架都通過一個“網絡連接數增加/減少”的方法回調來顯示網絡狀態,MKNetworkKit則由於使用了單例的共享隊列,能自動顯示網絡狀態。在共享隊列中有一個線程通過 KVO 方式會隨時觀察 operationCount 屬性。因此對於開發者,一般情況下根本不需要操心網絡狀態的顯示。
4、自動改變隊列大小
如前所述,絕大部分移動網絡不允許2個以上的併發連接,因此你的隊列大小在3G網絡下應當設置爲2。 MKNetworkKit 會自動爲你處理好這個。當網絡出於3G/EDGE/GPRS 時,它會將併發數調整到2。當網絡處於Wifi網絡時,則自動調整到6。當你通過3G網絡中從遠程服務器加載縮略圖時,這種調整能帶來極大的好處。
5、自動緩存
MKNetworkKit能自動緩存你所有的GET請求。當你再次發起同樣的請求時,MKNetworkKit隨即就能調用response緩存(如果可用的話)傳遞給handler進行處理。當然,它同時也向服務器發出請求。一旦獲得服務器數據,handler被再次要求處理新獲取的數據。也就是說,你不用手動緩存。你只需要使用:
[[MKNetworkEngine sharedEngine] useCache]; |
只要engine調用了此方法,即可判斷響應結果是否來源於緩存,方法如下: |
當然,你可以覆蓋這個方法(子類化),定製你的緩存路徑和緩存佔用的內存開銷。
6、凍結網絡操作
MKNetworkKit能夠“凍結”網絡操作。在一個網絡操作被“凍結”的情況下,一旦網絡連斷開,它們將自動序列化並在設備再次連線時自動被提交一次。類似 twitter 客戶端的“drafts”。
當你提交一篇 tweet 時,如果網絡被標記爲“可凍結”,MKNetworkKit會自動執行凍結並儲存這些請求。因此會在將來推遲發送這篇 tweet。整個過程不需要你寫一行代碼。這個特性你可以用於其他操作,諸如收藏一篇 tweet 或者從Goolge reader客戶端共享一個帖子,加一個鏈接到Instapaper 中,等等。
7、類似的請求只執行一個操作
當你加載縮略圖(針對twitter stream)時,你最終得爲每個實際的圖片創建一個新的請求。實際上你所進行的多個請求都是同一個URL。MKNetworkKit 對於隊列中的每個 GET 請求都只會執行一次。它還不能到緩存 POST 請求。
8、圖片緩存
MKNetworkKit內置了縮略圖緩存。只要覆蓋幾個方法,就可以設置內存中最大能緩存的圖片數量,以及緩存要保存到目錄。當然,你也可以不覆蓋這些方法。
9、性能
即速度。MKNetworkKit緩存是內置的,就如NSCache,當發現有內存警告,緩存到內存中的數據將被寫入緩存目錄。
10、完全支持ARC。
一般你只會在新項目中使用新的網絡框架。MKNetworkKit並不意味着要放棄已有的框架(當然你也可以放棄,這會是個乏味的工作)。對於新的項目,你總是想使用ARC。當你看到本文的時候,很可能MKNetworkKit會是僅有的完全支持ARC的網絡框架。ARC 通常比非 ARC 代碼更快。
二、MKNetworkKit基本用法
2.1 添加(導入)MKNetworkKit
1、把MKNetworkKit框架拷貝(copy)到需要使用該框架的工程目錄下
2、添加下列框架:CFNetwork.Framework,SystemConfiguration.framework, Security.framework and ImageIO.Framework
3、把MKNetworkKit添加到PCH文件中#import “MKNetworkKit.h”
4、對於iOS,刪除NSAlert+MKNetworkKitAdditions.h
5、對於Mac,刪除UIAlertView+MKNetworkKitAdditions.h
2.2 具體用法舉例
1、獲取豆瓣的json數據
解釋:通過https://api.douban.com/v2/movie/us_box請求下來的是json數據,
MKNetworkOperation封裝了一個解析json數據的方法responseJSON,方法內部使用系統自帶的json數據解析工具對獲取的數據進行解析之後返回回來。
注意:MKNetworkEngine的初始化方法initWithHostName:@"api.douban.com" customHeaderFields:nil,hostName代表主機名,切記不用寫http://或者https://,因爲在MKNetworkEngine的初始化方法內部已經添加了,如果是https協議,參數ssl應該爲YES;MKNetworkOperation的初始化方法中,path字符串不應該用/開頭,因爲在方法內部已經添加了。
2、下載文件
解釋:NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/beauty.jpeg"];獲取當前文件的沙盒目錄,把圖片下載到當前目錄並存爲beauty.jpeg;
[op addDownloadStream:[NSOutputStream outputStreamToFileAtPath:path append:YES]];該方法是MKNetworkOperation添加網絡下載文件的方法;
MKNetworkOperation內部封裝了一個responseImage方法
實時獲取下載進度:[downloadOperation onDownloadProgressChanged:^(double progress) {
//下載進度
NSLog(@"download progress: %.2f", progress*100.0);
}];
3、緩存操作
解釋:MKNetworkKit默認緩存所有的請求。你需要做的僅僅是在你的Engine上打開緩存。當GET請求執行時,如果響應之前被緩存過,你的完成處理代碼幾乎是立即會被調用並傳遞緩存過的響應,要知道請求是否被緩存,調用isCachedResponse方法。
4、凍結操作
可以確定的,MKNetworkKit的最又去的功能就是內置的凍結操作的功能。而你需要做的就是設置請求操作爲freezable,不用費任何力氣!
[opsetFreezable:YES];
凍結的操作會在網絡不通時自動的被序列化並且上線後自動執行。想一下你在離線時標記了一條微博爲喜歡,這樣的操作不會立即被執行,然後稍後上線之後操作會自動執行。也就是說凍結的操作也會被持久化到磁盤當app進入後臺之後。並且會在稍後app恢復之後自動執行。
5、post請求
三、AFNetworking、MKNetworkKit和ASIHTTPRequest對比
四、總結
4.1 使用MKNetworkKit時應該按照如下順序執行:
1)準備好url和請求參數
2)創建一個請求的MKNetworkOperation對象.
3)設置方法參數
4)添加完成和錯誤處理方法
5)可選的,還有請求操作的進度指示。(或者在viewController裏面處理)
6)如果你的操作時下載文件,那麼設置一個下載的流(通常是一個文件),這也是可選的
7)當請求操作完成時,處理結果並且調用block方法來向調用方法返回數據。
4.2 MKNetworkOperation中的便捷方法
MKNetworkOperation提供了一些如下便捷方法來方便你格式化你的響應數據
1)responseData
2)responseString
3)responseJSON(Only on iOS 5)
4)responseImage
5)responseXML
6)error
從網絡請求獲取響應很方便,當返回格式錯誤時,這些方法返回nil,比如試圖從響應爲html中獲取image會返回nil,唯一可以確保返回正確結果的方法時responseData,如果你確定返回類型,可以用其他方法。
4.3 細節注意
由於MKNetworkKit支持ARC,我們在項目中要開啓ARC,不然會報錯。所以如果項目沒有使用ARC的話需要告訴編譯器這個庫是支持ARC的,具體操作爲:
target->BuildPhases->Compile Sourses把跟MKNetworkKit相關的.m文件設置爲-fno-objc-arc。
申明:這是一個正在努力學習iOS的IT小學生,在網上找的資源,整合了一下,希望大家多多批評指正,我定虛心學習!!!