激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - Objective-C的MKNetworkKit開發框架解析

Objective-C的MKNetworkKit開發框架解析

2020-12-26 16:54whj IOS

這篇文章主要介紹了Objective-C的MKNetworkKit開發框架解析,MKNetworkKit是一個用于iOS開發的輕量級框架,需要的朋友可以參考下

什么是mknetworkkit?

mknetworkkit是一個 o-c 編寫的網絡框架,支持塊,arc 且用法簡單。

mknetworkkit 集 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:

Objective-C的MKNetworkKit開發框架解析

注意:由于mknetworkkit支持arc,我們在項目中要開啟arc,不然會報錯

Objective-C的MKNetworkKit開發框架解析

開啟arc自動內存控制機制:(開啟arc之后項目中所有的dealloc 、release 、autorelease都得注釋掉)

Objective-C的MKNetworkKit開發框架解析

使用方法:

  在需要使用的地方導入:#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/xml/plists)進行數據類型轉換。這應當在 engine 中完成。注意,不要在控制器中完成。你的 engine 應當將數據以適當的模型對象或模型對象的數組返回。在engine 中轉換 json/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 的隊列。

延伸 · 閱讀

精彩推薦
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111302021-03-15
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5272021-01-16
主站蜘蛛池模板: 这里精品| 亚州综合图片 | 亚洲免费看片网站 | 欧美一级电影网 | 中文字幕在线观看成人 | 亚洲3p激情在线观看 | 免费国产在线精品 | 欧美性黄| 又黄又爽免费无遮挡在线观看 | 成人在线视频免费播放 | 久色免费视频 | 久久精品黄 | 久久精品视频免费观看 | 一区二区久久精品66国产精品 | 越南一级黄色片 | 91九色丨porny丨国产jk | videos高潮 | 国产亚洲美女精品久久久2020 | 成人羞羞在线观看网站 | 日本一区二区三区精品 | 4p一女两男做爰在线观看 | 久久在现视频 | 亚洲成人伊人 | 国产在线观看av | 青青草最新网址 | 色播一区 | 91看片淫黄大片欧美看国产片 | 黄色大片在线免费观看 | 成人在线视频黄色 | 欧洲色阁中文字幕 | 国产成人精品一区二区仙踪林 | 日本黄网 | 性欧美xxxx极品摘花 | 俄罗斯hdxxx| 97久久曰曰久久久 | 黄在线免费看 | 欧美成人免费在线视频 | 国产成人强伦免费视频网站 | 日韩精品中文字幕一区二区 | 91精品国产九九九久久久亚洲 | 日本高清一级片 |