什么是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/
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];
MKNetworkEngine 是一个伪单例类,管理程序中的网络队列。它是伪单例的,也就是说,对于简单请求,你可以直接用MKNetworkEngine 中的方法。要进行深度的定制,你应该进行子类化。每个 MKNetworkEngine 子类有它自己的Reachability 对象,用于通知它来自服务器的reachability
通知。对于不同的 REST 服务器,你可以考虑创建单独的 MKNetworkEngine子类。创建一个 MKNetworkEngine 子类将你的网络请求进行逻辑上的分组,例如关于微博接口的请求方法,比如微博列表请求,评论列表请求等方法都可以放在这个类里面。
按如下顺序编写 engine类方法:
- 根据参数准备 URL
- 创建一个 MKNetworkOperation 对象
- 设置方法参数
- 设置 operation 的 completion 块和 error 块(在 completation 块中处理 response 并转换为模型)
- 可选地,添加一个 progress 块(或者在 view controller 中做这个)
- 如果 operation 是下载,设置下载流(通常是文件)。这步也是可选的
- 当 operation 完成,处理结果并调用方法块,并将数据返回给调用者。
现在我们来子类化MKNetworkKit来看看具体的用法;
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,就写到这里