什么是MKNetworkKit?
MKNetworkKit 是一个无缝基于Objective-C,block为基础,支持ARC的一个简单易用网络请求框架。MKNetworkKit 是受到了ASIHTTPRequest和AFNetworking这两个流行的网络框架的启发,结合了这两个框架的特性,MKNetworkKit添加了一些新的特性。除此这外,MKNetworkKit只需要你写些轻量的代码。这框架的介绍在我转载的文章(译文)可以看到:http://blog.csdn.net/id357015100/article/details/39780627
当然建议阅读原文(英文):http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit/
个人觉得网络模块很重要,很多项目都需要围绕着网络进行,以及软件的优化,缓存处理等问题都与网络有关。
先来两个基本的网络请求:
GET请求:
MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"www.weather.com.cn" customHeaderFields:nil];
//customHeaderFields :头信息,可以为nil
NSString *pathUrl = [NSString stringWithFormat:@"data/sk/%@.html",@101010300];
MKNetworkOperation *op = [engine operationWithPath:pathUrl params:nil httpMethod:@"GET"];
[op addCompletionHandler:^(MKNetworkOperation *completedOperation) {
NSLog(@"%@",[completedOperation responseJSON]);
} errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
}];
[engine enqueueOperation:op];
POST请求:
发送一条微博
MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"api.weibo.com" apiPath:@"2/statuses/update.json" customHeaderFields:nil];
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObject:@"2.003********vlCad41e6e8fbmGri2B" forKey:@"access_token"];
[params setObject:@"不带图片微博发送" forKey:@"status"];
MKNetworkOperation *op = [engine operationWithPath:nil params:params httpMethod:@"POST" ssl:YES];
[op addCompletionHandler:^(MKNetworkOperation *completedOperation) {
NSLog(@"微博发送成功");
} errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
NSLog(@"微博发送失败");
}];
[engine enqueueOperation:op];
按如下顺序编写 engine类方法:
- 根据参数准备 URL
- 创建一个 MKNetworkOperation 对象
- 设置方法参数
- 设置 operation 的 completion 块和 error 块(在 completation 块中处理 response 并转换为模型)
- 可选地,添加一个 progress 块(或者在 view controller 中做这个)
- 如果 operation 是下载,设置下载流(通常是文件)。这步也是可选的
- 当 operation 完成,处理结果并调用方法块,并将数据返回给调用者。
1.新建子类
2.在子类的.h文件申明一个发微博的方法
#import "MKNetworkEngine.h"
typedef void(^WeiboCompletionBlock)(id result);
typedef void(^ProgressBlock)(double progress);
@interface CLPWeiboNetwork : MKNetworkEngine
//发送微博方法
-(MKNetworkOperation*)sendWeibo:(NSData *) data
text:(NSString *)text
onCompletion:(WeiboCompletionBlock) completionBlock
onProgress:(ProgressBlock) progBlock
onError:(MKNKErrorBlock) errorBlock;
@end
3.在.m文件去实现这个方法
#import "CLPWeiboNetwork.h"
@implementation CLPWeiboNetwork
//发送微博方法
-(MKNetworkOperation*)sendWeibo:(NSData *) data
text:(NSString *)text
onCompletion:(WeiboCompletionBlock) completionBlock
onProgress:(ProgressBlock) progBlock
onError:(MKNKErrorBlock) errorBlock{
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObject:@"2.003********vlCad41e6e8fbmGri2B" forKey:@"access_token"];
[params setObject:text forKey:@"status"];
NSString *url = (data != nil)? @"2/statuses/upload.json":@"2/statuses/update.json";
MKNetworkOperation *op = [self operationWithPath:url params:params httpMethod:@"POST" ssl:YES];
if (data != nil) {
[op addData:data forKey:@"pic"];
}
[op setFreezable:YES];
[op addCompletionHandler:^(MKNetworkOperation *completedOperation) {
NSString *jsonString = [completedOperation responseJSON];
completionBlock(jsonString);
} errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
errorBlock(error);
}];
[op onUploadProgressChanged:^(double progress) {
progBlock(progress);
}];
[self enqueueOperation:op];
return op;
}
@end
4.现在我们在控制器.m文件中导入这个子类,并且调用它的发送微博的方法,这个接口我们只需要考虑发送的内容以及图片,还有像地图信息,隐私等信息我就没有考虑。
良好的设计体验是确保不要将 engine 类中的 URL/HTTPHeaders 暴露给调用者。你的视图不应该知道URL 或者相关的参数。也就是,只需要向 engine 方法传递你需要发送的微博内容,或者你需要的得到什么而需要的参数。由于是异步操作,你应当在块中返回这些值
。
我在这里就简单处理了,其实我也不清楚把类中的URL在哪里给它更好。
if (_weiboEngine == nil) {
_weiboEngine = [[CLPWeiboNetwork alloc] initWithHostName:@"api.weibo.com" customHeaderFields:nil];
}
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"1" ofType:@"jpg"]];
[_weiboEngine sendWeibo:data
text:@"带图片微博"
onCompletion:^(id result) {
NSLog(@"微博:%@",result);
}
onProgress:^(double progress) {
NSLog(@"微博上传进度");
}
onError:^(NSError *error) {
NSLog(@"错误");
}];
也许一条由未通过审核的应用发送就是这样简单。
现在我们该考虑给这个子类再添加几种方法,比如获取微博列表,评论列表etc,就写到这里