MKNetWorkKit的使用(1)
在整个程序中只有一个全局队列
MKNetWorkKit中主要有两个类,MKNetworkEngine和 MKNetworkOperation,MKNetworkOperation就是一个操作,是NSOperation的子类,每个HTTP操作通过 MKNetworkEngine入队,队列是一个NSOperationQueue,在程序是一个单例,在MKNetworkEngine的 initialize里创建。
GET请求
一般自己会复写MKNetworkEngine,在这里提供一个每一个网络请求的接口,可以传入参数,请求完成和失败的block。
self.yahooEngine = [[YahooEngine alloc] initWithHostName:@
"download.finance.yahoo.com"
];
YahooEngine的GET请求方法的申明
typedef
void
(^CurrencyResponseBlock)(
double
rate);
-(MKNetworkOperation*) currencyRateFor:(NSString*) sourceCurrency
inCurrency:(NSString*) targetCurrency
completionHandler:(CurrencyResponseBlock) completion
GET请求方法的实现
-(MKNetworkOperation*) currencyRateFor:(NSString*) sourceCurrency inCurrency:(NSString*) targetCurrency completionHandler:(CurrencyResponseBlock) completionBlock errorHandler:(MKNKErrorBlock) errorBlock { MKNetworkOperation *op = [self operationWithPath:YAHOO_URL(sourceCurrency, targetCurrency) params:nil httpMethod:@ "GET" ]; [op addCompletionHandler:^(MKNetworkOperation *completedOperation) { // the completionBlock will be called twice. // if you are interested only in new values, move that code within the else block NSString *valueString = [[completedOperation responseString] componentsSeparatedByString:@ "," ][1]; DLog(@ "%@" , valueString); if ([completedOperation isCachedResponse]) { DLog(@ "Data from cache %@" , [completedOperation responseString]); } else { DLog(@ "Data from server %@" , [completedOperation responseString]); } completionBlock([valueString doubleValue]); }errorHandler:^(MKNetworkOperation *errorOp, NSError* error) { errorBlock(error); }]; [self enqueueOperation:op]; return op; }
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
self.currencyOperation = [ApplicationDelegate.yahooEngine currencyRateFor:@ "SGD" inCurrency:@ "USD" completionHandler:^( double rate) { [[[UIAlertView alloc] initWithTitle:@ "Today's Singapore Dollar Rates" message:[NSString stringWithFormat:@ "%.2f" , rate] delegate:nil cancelButtonTitle:NSLocalizedString(@ "Dismiss" , @ "" ) otherButtonTitles:nil] show]; } errorHandler:^(NSError* error) { DLog(@ "%@\t%@\t%@\t%@" , [error localizedDescription], [error localizedFailureReason], [error localizedRecoveryOptions], [error localizedRecoverySuggestion]); }]; |
POST请求,上传一张图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
-(MKNetworkOperation*) uploadImageFromFile:(NSString*) file completionHandler:(IDBlock) completionBlock errorHandler:(MKNKErrorBlock) errorBlock { MKNetworkOperation *op = [self operationWithPath:@ "upload.php" params:@{@ "Submit" : @ "YES" } httpMethod:@ "POST" ]; [op addFile:file forKey:@ "image" ]; // setFreezable uploads your images after connection is restored! [op setFreezable:YES]; [op addCompletionHandler:^(MKNetworkOperation* completedOperation) { NSString *xmlString = [completedOperation responseString]; DLog(@ "%@" , xmlString); completionBlock(xmlString); } errorHandler:^(MKNetworkOperation *errorOp, NSError* error) { errorBlock(error); }]; [self enqueueOperation:op]; return op; } |
上传的时候可以增加一个进度条,所以在调用这个方法的时候可以有以下代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
NSString *uploadPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingFormat:@ "/SampleImage.jpg" ]; self.uploadOperation = [ApplicationDelegate.testsEngine uploadImageFromFile:uploadPath completionHandler:^(id twitPicURL) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@ "Uploaded to" message:(NSString*) twitPicURL delegate:nil cancelButtonTitle:NSLocalizedString(@ "Dismiss" , @ "" ) otherButtonTitles:nil]; [alert show]; self.uploadProgessBar.progress = 0.0; } errorHandler:^(NSError* error) { [UIAlertView showWithError:error]; }]; [self.uploadOperation onUploadProgressChanged:^( double progress) { DLog(@ "%.2f" , progress*100.0); self.uploadProgessBar.progress = progress; }]; |
正确显示网络状态指示
正确显示网络状态指示的判断条件就是操作operation数大于0的时候。
自动改变队列大小
在wifi以及3G网络是会调用setMaxConcurrentOperationCount:方法切换最大操作数的大小。
自动缓存
MKNetWorkKit能够缓存你所有的GET请求,当请求相同时会调用本地缓存内容。
1
|
[self.yahooEngine useCache]; |
清空缓存使用如下方法
1
|
[ApplicationDelegate.yahooEngine emptyCache]; |
冻结网络操作
网络断开时的网络请求会被冻结,通过NSKeyedArchiver序列化在本地,当有网时会再次请求。MKNetworkOperation的setFreezable:方法就是冻结操作。
1
|
[op setFreezable:YES]; |
类似的请求只请求一个操作
就是同一个URL只请求一次。
图片缓存
MKNetworkEngine的imageAtURL:completionHandler:errorHandler:方法能够缓存图片。
1
2
3
4
|
[ApplicationDelegate.apiEngine imageAtURL:[NSURL URLWithString:(_strategyModel.titlepic)] completionHandler:^(UIImage* fetchedImage, NSURL* url, BOOL isInCache){ [iv setImage:fetchedImage]; }errorHandler:nil]; |
当然MKNetworkEngine的operationWithURLString: params: httpMethod:方法也可以请求图片,并且缓存,它其实就是根据一个URL地址来创建一个网络线程,然后把它加入到队列就可以了。
1
2
3
4
5
6
7
8
9
10
11
12
|
MKNetworkOperation *op1 =[ApplicationDelegate.apiEngine operationWithURLString:_strategyModel.titlepic params:nil httpMethod:nil]; [op1 addCompletionHandler:^(MKNetworkOperation *completedOperation) { // [op1 responseImage]; [iv setImage:[completedOperation responseImage]]; } errorHandler:^(MKNetworkOperation *errorOp, NSError* error) { }]; [ApplicationDelegate.apiEngine enqueueOperation:op1]; |
其实MKNetworkOperation有各种response数据,这里是responseImage,还有responseString、responseJSON、responseXML。
不过请求一个图片还可以使用MK提供的category,UIImageView+MKNetworkKitAdditions里面的方法,如下,不过我试了之后好像没有缓存,不过这个可以用于tableview上每个cell上显示的图片,比上面的要方便许多。
1
2
|
[self.thumbnailImage setImageFromURL:[NSURL URLWithString:self.loadingImageURLString] placeHolderImage:nil]; |
缓存operation
其实每一个get请求都有缓存,要想知道你返回的数据是否缓存,可以用以下方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[op addCompletionHandler:^(MKNetworkOperation *completedOperation) { // the completionBlock will be called twice. // if you are interested only in new values, move that code within the else block if ([completedOperation isCachedResponse]) { DLog(@ "Data from cache %@" , [completedOperation responseString]); } else { DLog(@ "Data from server %@" , [completedOperation responseString]); } completionBlock([valueString doubleValue]); }errorHandler:^(MKNetworkOperation *errorOp, NSError* error) { errorBlock(error); }]; |
下载文件
下载文件的时候也可以增加进度条,方法类似上面上传文件的使用,下载文件痛哟在操作上增加一个一个输出流,下载文件的实现可以如下。
1
2
3
4
5
6
7
8
9
10
|
-(MKNetworkOperation*) downloadFatAssFileFrom:(NSString*) remoteURL toFile:(NSString*) filePath { MKNetworkOperation *op = [self operationWithURLString:remoteURL]; [op addDownloadStream:[NSOutputStream outputStreamToFileAtPath:filePath append:YES]]; [self enqueueOperation:op]; return op; } |
MKNetWorkKit的使用(1)的更多相关文章
- 一个iOS 框架介绍:MKNetworkKit
http://blog.csdn.net/kmyhy/article/details/12276287 http://blog.csdn.net/mobailwang/article/details/ ...
- AFNetworking、MKNetworkKit和ASIHTTPRequest对比
之前一直在使用ASIHTTPRequest作为网络库,但是由于其停止更新,iOS7上可能出现更多的问题,于是决定更换网络库. 目前比较流行的网络库主要有AFNetworking和MKNetworkKi ...
- AFNetworking vs ASIHTTPRequest vs MKNetworkKit
AFNetworking vs ASIHTTPRequest vs MKNetworkKit
- MKNetworkKit: 网络处理又一利器
没有认识MK之前,即便ASI已经不再更新,也没有启用ASI.因为ASI对于网络的处理更偏向于底层,适合针对各种情形的扩展. 但是,今天我要开始使用 MKNetworkKit了,项目在github上,使 ...
- iOS开发:AFNetworking、MKNetworkKit和ASIHTTPRequest比较
转:http://www.xue5.com/Mobile/iOS/747036.html 之前一直在使用ASIHTTPRequest作为网络库,但是由于其停止更新,iOS7上可能出现更多的问题,于是决 ...
- (转载)iOS Framework: Introducing MKNetworkKit
This article is available in Serbo-Croatian, Japanese and German. (Translations in Serbo-Croatian b ...
- ios MKNetworkKit 的使用
常用框架比如:AFNetworking,ASIHttpRequest,SDWebImage,MKNetWorKit等. iOS5已出来这么久了,而ASIHttpRequest的作者已经申明不更新了,在 ...
- MKNetworkKit 使用
关于ios 网络请求之MKNetworkKit库的使用 项目导入MK库之后,还需要导入三个框架文件: SystemConfiguration.framework CFNetwork.framework ...
- iOS Framework: Introducing MKNetworkKit
MKNetworkKit介绍,入门.翻译 这片文章也有塞尔维亚-克罗地亚语(由Jovana Milutinovich翻译)和日语(由@noradaiko翻译) 假设有个一个网络库可以自己主动的为你处 ...
- iOS Framework: Introducing MKNetworkKit (MKNetworkKit介绍,入门,翻译)
这片文章也有塞尔维亚-克罗地亚语(由Jovana Milutinovich翻译)和日语(由@noradaiko翻译) 如果有个一个网络库能够自动的为你处理cache该有多好啊. 如果有一个网络库能够在 ...
随机推荐
- Linux学习总结(4)——Centos6.5使用yum安装mysql——快速上手必备
第1步.yum安装mysql [root@stonex ~]# yum -y install mysql-server 安装结果: Installed: mysql-server.x86_6 ...
- 洛谷 P2430 严酷的训练
P2430 严酷的训练 题目背景 Lj的朋友WKY是一名神奇的少年,在同龄人之中有着极高的地位... 题目描述 他的老师老王对他的程序水平赞叹不已,于是下决心培养这名小子. 老王的训练方式很奇怪,他会 ...
- Validation failed for query for method public abstract boxfish.bean.Student boxfish.service.StudentServiceBean.find(java.lang.String)!
转自:https://blog.csdn.net/lzx925060109/article/details/40323741 1. Exception in thread "main&quo ...
- System.Text.Encoding.Default
string strTmp = "abcdefg某某某";int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;/ ...
- 【例题 6-13 UVA - 1103】Ancient Messages
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个图案里面的"洞"的个数都是不同的. 则可以根据这个判别每个图像是什么. 先用dfs确定轮廓之后. 再从每个白 ...
- amazeui页面分析2
amazeui页面分析2 一.总结 1.弄清结构:这些部分都是一块一块分好了的,掌握结构之后,想替换哪块就替换哪块,想不要哪块就不要哪块,非常简单的 2.一块一块:替换十分简单 3.弄清楚大块之后,然 ...
- 杭电ACM1197——Specialized Four-Digit Numbers
题目的意思是从2992開始的四位数.每个四位数的10.12,16进制的数的每一位加起来都相等,就输出该数. 非常easy的一道题目. 以下的是AC的代码: #include <iostream& ...
- 重新配置vim
重新配置,并非折腾,发个链接吧留着以后用。 都是前辈 vimer程序员的世界 Vim(gvim)配色方案推荐 gvim(vim)使用微软雅黑中文字体 Vim(gvim)编程字体推荐 所需即所获:像 I ...
- jquery 无刷新上传的小function
function zll_up(click_id,up_url,text_id,show_id){ this.create = function(){} //当点击指定元素时,创建iframe for ...
- 机器学习01-kNN邻近算法
k-近邻算法 概述:k-近邻算法採用測量不同特征值之间的距离方法进行分类 长处:精度高.对于异常值不敏感.无数据输入假定 缺点:计算复杂度高,空间复杂度高,而且它没有办法各处基础数据的一些内部信息数据 ...