浅析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小学生,在网上找的资源,整合了一下,希望大家多多批评指正,我定虚心学习!!!