你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> Objective-C的MKNetworkKit開辟框架解析

Objective-C的MKNetworkKit開辟框架解析

編輯:IOS開發綜合

甚麼是M.networkKit?

M.networkKit是一個 O-C 編寫的收集框架,支撐塊,ARC 且用法簡略。

M.networkKit 集 ASIHTTPRequest 和 AFNetworking 兩個框架於一體。在集成兩者的優良特征以外,還增長了一堆新的功效。特別是,比擬起其它框架,它能讓你更輕松地編寫代碼。它讓你完全闊別那些惡心的收集代碼。

特色

超輕量級框架

全部框架只要 2 個類和一些種別辦法。是以,它的應用極端簡略。

在全部法式中只要一個全局隊列。

高度依附互聯網銜接的 app 應當優先斟酌收集線程的並發數。不幸的是,沒有任何收集框架在這方面做得夠好。是以,一旦你在法式中沒有掌握好收集線程的並發數,就極易招致失足。

假定你要上傳一堆圖片到辦事器上。絕年夜多半挪動收集(3G)不會許可你對統一個IP 地址的 HTTP 並發銜接數跨越 2 個。換句話說,在裝備上,你不克不及從 3G 收集中取得 2 個以上的 HTTP 並發銜接。關於 Edge 則更糟,年夜多半情形不克不及跨越1 個。比擬較家用寬帶收集(Wifi),則這個限制要寬很多(6 個)。然則,你弗成能老是應用 wifi,你必需也斟酌到無限收集(窄帶)的連通性。更多的時刻,iDevice裝備簡直都能銜接到 3G 收集,是以,你同時只能上傳 2 張圖片。然則,真實的成績不是遲緩的上傳速度,而是另外一種情形。在你翻開一個 view 試圖加載縮略圖(分歧的view)時,上傳線程被運轉到後台。假如你沒有掌握好上傳隊列中的線程數,你的縮略圖會加載超時。這是不正常的。准確的方法是優化縮略圖加載線程,或許讓線程期待直到上傳完成再加載縮略圖。這須要你在全部法式中只具有一個queue 隊列。

MKNetworkKit 在它的每一個實例中應用單例來包管這一點。其實不是說MKNetworkKit 是單例的,而是說它的同享隊列是單例的。


經常使用框架好比:AFNetworking,ASIHttpRequest,SDWebImage,MKNetWorKit等。
如今MKNetWorkKi汲取了ASIHttpRequest與AFNetWorking的長處,並參加了本身獨有的功效。

下載:

gitHub地址:https://github.com/MugunthKumar/MKNetworkKit.git

官方應用解釋:http://blog.mugunthkumar.com/products/IOS-framework-introducing-mknetworkkit/

github下載了該項目後,假如想運轉其demo,必定要翻開MKNetworkKit.xcworkspace該文件,若零丁翻開,則編譯時會提醒缺乏libMKNetworkKit-IOS.a文件!!!

裝置:

克隆上去以後把個中的 MKNetworkKit文件夾拖入項目,然後引入3個framework:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452021.png (564×197)

留意:因為MKNetworkKit支撐ARC,我們在項目中要開啟ARC,否則會報錯

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452050.png (990×79)

開啟ARC主動內存掌握機制:(開啟ARC以後項目中一切的dealloc 、release 、autorelease都得正文失落)

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615452054.png (1024×339)

應用辦法:

  在須要應用的處所導入:#import"MKNetworkKit.h"
准確顯示收集狀況指導

很多第 3 方框架都經由過程一個“收集銜接數增長/削減”的辦法回調來顯示收集狀況,MKNetworkKit則因為應用了單例的同享隊列,能主動顯示收集狀況。在同享隊列中有一個線程經由過程 KVO 方法會隨時不雅察 operationCount 屬性。是以關於開辟者,普通情形下基本不須要費心收集狀況的顯示。

if (object == _sharedNetworkQueue && [keyPath isEqualToString:@"operationCount"]) {

     [UIApplication sharedApplication].networkActivityIndicatorVisible =        ([_sharedNetworkQueue.operations count] < 0);

     }

主動轉變隊列年夜小

如前所述,絕年夜部門挪動收集不許可 2 個以上的並發銜接,是以你的隊列年夜小在3G 收集下應該設置為 2。 MKNetworkKit 會主動為你處置好這個。當收集出於3G/EDGE/GPRS 時,它會將並發數調劑到 2。當收集處於 Wifi 收集時,則主動調劑到 6。當你經由過程 3G 收集中從長途辦事器加載縮略圖時,這類調劑能帶來極年夜的利益。

主動緩存

MKNetworkKit 能主動緩存你一切的 GET 要求。當你再次提議異樣的要求時,MKNetworkKit 隨即就可以挪用 response緩存(假如可用的話)傳遞給 handler 停止處置。固然,它同時也向辦事器收回要求。一旦取得辦事器數據,handler 被再主要求處置新獲得的數據。也就是說,你不消手動緩存。你只須要應用:

 [[MKNetworkEngine sharedEngine] useCache];

固然,你可以籠罩這個辦法(子類化),定制你的緩存途徑懈弛存占用的內存開支。

解凍收集操作

MKNetworkKit 可以或許“解凍”收集操作。在一個收集操作被“解凍”的情形下,一旦收集連斷開,它們將主動序列化並在裝備再次連線時主動被提交一次。相似 twitter 客戶真個“drafts”。

當你提交一篇 tweet 時,假如收集被標志為“可解凍”,MKNetworkKit 會主動履行解凍並貯存這些要求。是以會在未來推延發送這篇 tweet。全部進程不須要你寫一行代碼。這個特征你可以用於其他操作,諸如珍藏一篇 tweet 或許從 Goolge reader 客戶端同享一個帖子,加一個鏈接到Instapaper 中,等等。

相似的要求只履行一個操作:

當你加載縮略圖(針對 twitter stream)時,你終究得為每一個現實的圖片創立一個新的要求。現實上你所停止的多個要求都是統一個URL。MKNetworkKit 關於隊列中的每一個 GET 要求都只會履行一次。它還不克不及到緩存 POST 要求。

圖片緩存

MKNetworkKit 內置了縮略圖緩存。只需籠罩幾個辦法,便可以設置內存中最年夜能緩存的圖片數目,和緩存要保留到目次。固然,你也能夠不籠罩這些辦法。

機能

即速度。MKNetworkKit 緩存是內置的,就如 NSCache,當發明有內存正告,緩存到內存中的數據將被寫入緩存目次。

完整支撐 ARC

普通你只會在新項目中應用新的收集框架。MKNetworkKit其實不意味著要廢棄已有的框架(固然你也能夠廢棄,這會是個有趣的任務)。關於新的項目,你老是想應用 ARC。當你看到本文的時刻,極可能 MKNetworkKit  會是唯一的完整支撐 ARC 的收集框架。ARC 平日比非 ARC 代碼更快。

用法

Ok,我就不“自賣自诩”了。讓我們立刻懂得假如應用這個框架。

添加MKNetworkKit

將 MKNetworkKit 目次拖到項目中

添加以下框架: CFNetwork.Framework, SystemConfiguration.framework, Security.framework and ImageIO.Framework.

將 MKNetworkKit.h 頭文件包括到 PCH 文件中

關於 IOS,刪除 NSAlert+MKNetworkKitAdditions.h

關於 Mac,刪除 UIAlertView+MKNetworkKitAdditions.h

總共只須要 5 個焦點文件,真是一個壯大的收集開辟包

MKNetworkKit 的類

MKNetworkOperation

MKNetworkEngine

一些對象類 (Apple 的 Reachability) 和種別

我愛好簡略。蘋果曾經寫了最根本最焦點的收集代碼。第 3 方框架須要的是供給一個優雅的收集隊列最多再加上緩存。我以為第3 方框架不該該跨越 10 個類(不管它是收集的照樣 UIKit 照樣其余甚麼)。跨越這個數就太癡肥了。Three20 就是一個例子。如今 ShareKit 又是如許。雖然它們是優良的,但依然是宏大和癡肥的。ASIHttpRequest or AFNetworking 比 RESTKit 更輕,JSONKit比TouchJSON (或許任何 TouchCode 庫)更輕。這只是我本身的意見,但當一個第三方庫的代碼跨越法式源代碼1/3,我就不會應用它。

框架癡肥帶來的成績是很難懂得它的外部任務機制,和很難依據本身的需求定制它(當你須要時)。我已經寫過的一些框架(例如MKStoreKit ,用於運用法式內購的 )老是易於應用,我以為MKNetworkKit 也應當是如許。關於 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 個現實應用的例子。

例1:

創立一個  “YahooEngine” 從 Yahoo 財經辦事器抓取泉幣匯率。

步調 1:創立YahooEngine 類繼續於MKNetworkEngine。MKNetworkEngine 應用主機名和指定的頭(假如有的話)停止初始化。頭信息可所以nil。假如你是在本身的 REST 辦事器上,你可以斟酌加一個客戶端 app 的版本或許其他信息(好比客戶真個標識)。


NSMutableDictionary *headerFields = [NSMutableDictionary dictionary];     [headerFields setValue:@"iOS"forKey:@"x-client-identifier"];

self.engine = [[YahooEngine alloc] initWithHostName:@"download.finance.yahoo.com"                        customHeaderFields:headerFields];

 

留意,yahoo 其實不辨認你在頭中發送x-client-identifier 給它,這個示例僅僅是演示這個特征而

因為應用了 ARC 代碼,作為開辟者你須要具有(強援用)Engine對象。

一旦你創立了一個 MKNetworkEngine子類, Reachability 即主動完成。當你的辦事器因為某些情形掛了,主機名弗成拜訪,你的要求會主動被解凍。關於“解凍”,請參考前面的“解凍操作”末節。

步調 2:設計Engine 類 (存眷分別)

如今,開端編寫 Yahoo Engine 中的辦法,以抓取匯率。這些辦法將在ViewController 中被挪用。優越的設計體驗是確保不要將 engine 類中的 URL/HTTPHeaders 裸露給挪用者。你的視圖不該該曉得URL 或許相干的參數。也就是,只須要向 engine 辦法傳遞泉幣品種和泉幣單元便可以了。辦法的前往值能夠是 double,即匯率,和獲得匯率的時光。因為是異步操作,你應該在塊中前往這些值。例如:

-(MKNetworkOperation*) currencyRateFor:(NSString*) sourceCurrency                  

            inCurrency:(NSString*) targetCurrency   

        onCompletion:(CurrencyResponseBlock) completion

        onError:(ErrorBlock) error;

在父類 MKNetworkEngine 中,界說了3 個塊類型:

typedef void (^ProgressBlock)(double progress);

typedef void (^ResponseBlock)(MKNetworkOperation* operation);

typedef void (^ErrorBlock)(NSError* error);

在 YahooEngine中,我們應用了一個新的塊類型:CurrencyResponseBlock,用以前往匯率。其界說以下:

typedef void (^CurrencyResponseBlock)(double rate);

在其他正式的 app 中,你應當界說本身的塊相似於CurrencyResponseBlock ,用以向 ViewController 前往數據。

步調 3:處置數據
處置數據,包含將從辦事器抓來的數據(例如 JSON/XmlRss/ target=_blank class=infotextkey>Xml/plists)停止數據類型轉換。這應該在 Engine 中完成。留意,不要在掌握器中完成。你的 Engine 應該將數據以恰當的模子對象或模子對象的數組前往。在engine 直達換 JSON/XmlRss/ target=_blank class=infotextkey>Xml 為模子——留意,恰當堅持存眷分別,view controller 不該當曉得任何用於拜訪 JSON 節點的 key。這類思惟主導了engine 的設計。很多收集框架其實不強迫請求你屈服存眷分別,我們如許做,是由於我們為你斟酌到了。

步調 4:完成辦法
如今,我們來評論辯論辦法完成細節。要從 Yahoo 取得匯率信息,最簡略的是提議一個 GET 要求。以下宏用一對指定的泉幣格局化 URL 字串:

We will now discuss the implementationdetails of the method that calculates your currency exchange.

Getting currency information from Yahoo,is as simple as making a GET request.
I wrote a macro to format this URL for a given currency pair.

#define YAHOO_URL(__C1__, __C2__) [NSString stringWithFormat:@"d/quotes.csv?e=.csv&f=sl1d1t1&s=%@%@=X", __C1__, __C2__]

按以下次序編寫 engine類辦法:

依據參數預備 URL

創立一個 MKNetworkOperation 對象

設置辦法參數

設置 operation 的 completion 塊和 error 塊(在 completation 塊中處置 response 並轉換為模子)

可選地,添加一個 progress 塊(或許在 view controller 中做這個)

假如 operation 是下載,設置下載流(平日是文件)。這步也是可選的

當 operation 完成,處置成果並挪用辦法塊,並將數據前往給挪用者。

示例代碼以下:

MKNetworkOperation *op = [selfoperationWithPath:YAHOO_URL(sourceCurrency, targetCurrency)

params:nil

httpMethod:@"GET"];

 

    [op onCompletion:^(MKNetworkOperation*completedOperation)

     {

        DLog(@"%@", [completedOperation responseString]);

 

 //do your processing here

         completionBlock(5.0f);

 

     }onError:^(NSError* error) {

 

         errorBlock(error);

     }];

 

    [self enqueueOperation:op];

 

    return op;

上述代碼格局化 URL 並創立了 MKNetworkOperation。設置完 completion 和 error 塊以後,將 operation 參加到隊列(經由過程父類的 enqueueOperation 辦法),然後前往一個 operation 的援用。是以,假如你在 viewDidAppear 中挪用這個辦法,則在 viewWillDisappear 辦法中撤消operation。撤消 operation 將釋放 operation 以便履行 queue 頂用於其他view 的 operation(切記,在挪動收集中只要2 個 operation 能被同時停止,當 operation 不再須要時撤消它們能晉升 app 的機能和速度)。

在 viewcontroller 中也能夠添加一個 progress 塊用以刷新UI。例如:

[self.uploadOperation onUploadProgressChanged:^(double progress) {  

      DLog(@"%.2f", progress*100.0);             

      self.uploadProgessBar.progress = progress;     }];

MKNetworkEngine 也有一個只用 URL 創立 operation 的有效辦法。是以第1行代碼也能夠寫成:

MKNetworkOperation *op = [self operationWithPath:YAHOO_URL(sourceCurrency, targetCurrency)];

留意,要求的 URL將主動添加上主機名(在 engine 實例化時指定的)。

 

像如許的適用辦法 MKNetworkEngine還有很多,你可以檢查頭文件。

例2:

上傳圖片到辦事器 (例如 TwitPic)。
如今讓我們看一個上傳圖片到辦事器的例子。要上傳圖片,明顯要 operation 能編碼 multi-part 表雙數據。 MKNetworkKit 應用相似 ASIHttpRequest 的方法。
你可以異常簡略地經由過程MKNetworkOperation 的 addFile:forKey:辦法將一個文件作為要求中的 multi-part 表雙數據提交。

MKNetworkOperation 也有一個辦法,可以將圖片以 NSData 的方法提交。即 addData:forKey: 辦法,它可以將圖片以NSData 的辦法上傳到辦事器。 (例如直接從相機中捕捉的圖片).

例3:

下載文件到當地目次 (緩存)
應用MKNetworkKit 從辦事器下載文件並保留到 iPhone 的當地目次異常簡略。

只須要設置 MKNetworkOperation的 outputStream 。

[operation setDownloadStream:[NSOutputStream         outputStreamToFileAtPath:@"/Users/mugunth/Desktop/DownloadedFile.pdf"                         append:YES]];

你可以設置多個 outputStream 到一個 operation,將統一文件保留到幾個處所(例如個中一個是你的緩存目次,另外一個用做你的任務目次)。

例4:

緩存圖片的縮略圖

關於下載圖片,你能夠須要供給一個相對 URL 地址而不是一個途徑。
MKNetworkEngine 的operationWithURLString:params:httpMethod: 辦法依據相對 URL地址來創立收集線程。

MKNetworkEngine 相當聰慧。它會將統一個 URL 的屢次 GET 要求歸並成一個,當 operation 完成時它會告訴一切的塊。這明顯晉升了抓取圖片 URL 以襯著縮略圖的速度.

子類化 MKNetworkEngine然後籠罩圖片的緩存目次及緩存的年夜小。假如你不想定制這兩者,你可以直接挪用 MKNetworkEngine中的辦法來下載圖片。這是我死力推舉的。

緩存operation

MKNetworkKit 默許會緩存一切要求。你所須要的僅僅是在你本身的 engine 中翻開它。當履行一個 GET 要求時,假如前次的 response 已緩存,響應的 completion 塊將用緩存的response 停止挪用(剎時)。要想曉得 response 能否緩存,可以挪用 isCachedResponse 辦法,以下所示:

[op onCompletion:^(MKNetworkOperation *completedOperation) {

          if([completedOperation isCachedResponse]) {

              DLog(@"Data from cache");

          }else {

              DLog(@"Data from server");

          }

            DLog(@"%@", [completedOperation responseString]);

      }

onError:^(NSError* error) {

            errorBlock(error);

}];

解凍operation

MKNetworkKit 的一個最風趣的特征是它內置的解凍 operation 特征。你只須要設置 operation 的 freeesable 屬性便可以。簡直甚麼也不消做!

[op setFreezable:YES];

解凍是指 operation 在收集被斷開時主動序列化並在收集恢復後主動履行。例如當你離線時也可以或許停止珍藏tweet 的操作,然後在你再次上線時 operation 主動恢復履行。

在運用法式進入後台時,解凍的 operation 也會被耐久化到磁盤。然後在運用法式回到前台後主動恢復履行。

MKNetworkOperation 中的有效辦法

以下所示,MKNetworkOperation 地下了一些有效的辦法,你可從中獲得各類格局的 response 數據:

responseData

responseString

responseJSON (Only on iOS 5)

responseImage

responseXml

error

當 operation 履行完時,這些辦法被用於獲得呼應數據。假如格局不准確,辦法會前往nil。例如,呼應的數據明明是一個 HTML 格局,你用 responseImage 辦法只會獲得 nil。只要 responseData 能包管不管甚麼格局都前往准確,而其他辦法你必需確保和響應的repsone 類型婚配。

有效的宏

DLog 和 ALog 宏被無恥地從 Stackoverflow 抄襲來了,我找不到源作者。假如是你寫的,請告知我。

關於GCD 的一點解釋

由於收集線程有能夠會能被停滯或優先處置,我武斷廢棄了 GCD——GCD 的效力是比NSOperation 高,但它做不到這一點。我建議在你的收集線程中也不要應用基於 GCD 的隊列。

【Objective-C的MKNetworkKit開辟框架解析】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved