现在的位置: 首页 > 综合 > 正文

MKNetworkKit框架的使用

2018年03月20日 ⁄ 综合 ⁄ 共 4169字 ⁄ 字号 评论关闭

什么是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];

MKNetworkEngine 是一个伪单例类,管理程序中的网络队列。它是伪单例的,也就是说,对于简单请求,你可以直接用MKNetworkEngine 中的方法。要进行深度的定制,你应该进行子类化。每个 MKNetworkEngine 子类有它自己的Reachability 对象,用于通知它来自服务器的reachability
通知。对于不同的 REST 服务器,你可以考虑创建单独的 MKNetworkEngine子类。创建一个 MKNetworkEngine 子类将你的网络请求进行逻辑上的分组,例如关于微博接口的请求方法,比如微博列表请求,评论列表请求等方法都可以放在这个类里面。

按如下顺序编写 engine类方法:

  1. 根据参数准备 URL
  2. 创建一个 MKNetworkOperation 对象
  3. 设置方法参数
  4. 设置 operation 的 completion 块和 error 块(在 completation 块中处理 response 并转换为模型)
  5. 可选地,添加一个 progress 块(或者在 view controller 中做这个)
  6. 如果 operation 是下载,设置下载流(通常是文件)。这步也是可选的
  7. 当 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,就写到这里




抱歉!评论已关闭.