淺析MKNetworkKit(studying)

 

淺析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小學生,在網上找的資源,整合了一下,希望大家多多批評指正,我定虛心學習!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章