ios开发之 mknetworkkit

mknetworkkit 结合了 ASIHTTPRequest和AFNetworking这两个类库的优点,也增加了自己的一点新特性,它使用像AFNetworking这么简单,而功能像ASIHTTPRequest(已经停止维护)那么强大.
下载地址: https://github.com/MugunthKumar/MKNetworkKit/ 
将下载包中的  MKNetWorkKit  文件夹拖到你新建的工程中。添加:SystemConfiguration.framework,CFNetwork.framework,Security.framework和 ImageIO.framework
目前网上的介绍全都是旧版的MKNetworkKit, 新版的MKNetworkKit需要 ImageIO.framework, 否则会报错. 
首先介绍这个类库怎么用:
get请求:
NSDictionary *dic = [NSDictionary dictionaryWithObject:@"2.00luajUCkXYcfDc0508709c0avmFCE" forKey:@"access_token"];
    MKNetworkEngine *engine = [[MKNetworkEngine alloc]init];
    MKNetworkOperation *operation = [engine operationWithURLString:@"https://api.weibo.com/2/statuses/home_timeline.json" params:dic httpMethod:@"GET"];
    [operation addCompletionHandler:^(MKNetworkOperation *completedOperation) {
        NSLog(@"%@",[completedOperation responseString]);
    } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
        NSLog(@"%@",[error localizedDescription]);
    }];
    
    [engine enqueueOperation:operation];
首先床架引擎对象,在调用

(MKNetworkOperation*) operationWithURLString:(NSString*) urlString

                                       params:(NSDictionary*) body

                                   httpMethod:(NSString*)method这个方法,此方法返回一个mknetworkOperation对象,只要将此对象加入队列中即可。此对象调用addCompletionHandler:^(MKNetworkOperation *completedOperation)方法会返回请求过来的数据。

MKNetworkOperation 提供了一些如下便捷方法来方便你格式化你的响应数据

  1. responseData
  2. responseString
  3. responseJSON (ios5以上)
  4. responseImage
  5. responseXML
  6. error

从网络请求获取响应很方便,当返回格式错误时,这些方法返回nil,比如试图从响应为html中获取image会返回nil,唯一可以确保返回正确结果的方法时responseData,如果你确定返回类型,可以用其他方法。


post请求:

NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObject:@"2.00luajUCkXYcfDc0508709c0avmFCE" forKey:@"access_token"];
    [dic setValue:@"啊哈哈!" forKey:@"status"];
    MKNetworkEngine *engine = [[MKNetworkEngine alloc]init];
    MKNetworkOperation *operation = [engine operationWithURLString:@"https://api.weibo.com/2/statuses/update.json" params:dic httpMethod:@"POST"];
    [operation addCompletionHandler:^(MKNetworkOperation *completedOperation) {
        NSLog(@"%@",[completedOperation responseString]);
    } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
        NSLog(@"%@",[error localizedDescription]);
    }];
    
    [engine enqueueOperation:operation];
下载图片:

MKNetworkEngine *engine = [[MKNetworkEngine alloc]init];
    
    MKNetworkOperation *operation = [engine operationWithURLString:@"http://c.hiphotos.baidu.com/image/h%3D1050%3Bcrop%3D0%2C0%2C1680%2C1050/sign=2878735488d4b31cef3c90bbb2e61c1c/71cf3bc79f3df8dcb395e786ce11728b47102878.jpg" params:nil httpMethod:@"GET"];
    [operation onDownloadProgressChanged:^(double progress) {
        NSLog(@"%f",progress);
        downProgress.progress = progress;
        NSLog(@"%@",NSHomeDirectory());
        if (progress == 1) {
            _image.image = [UIImage imageWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"a.jpg"]];
        }
    }];
    [operation addDownloadStream:[NSOutputStream outputStreamToFileAtPath:[NSHomeDirectory() stringByAppendingPathComponent:@"a.jpg"] append:NO]];
    [engine enqueueOperation:operation];
下载图片时调用 onDownloadProgressChanged:^(double progress)方法会实时返回下载进度,调用 addDownloadStream:方法将下载的文件写到什么路径下,给个路径即可。

上传图片:

NSString* path =  [[NSBundle mainBundle] pathForResource:@"d3"ofType:@"jpg"];
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObject:@"2.00luajUCkXYcfDc0508709c0avmFCE" forKey:@"access_token"];
    [dic setValue:@"啊哈哈!" forKey:@"status"];
    //NSData *data = UIImageJPEGRepresentation([UIImage imageNamed:@"33.jpg"], 1);
    //[dic setValue:data forKey:@"pic"];
    
    MKNetworkEngine *engine = [[MKNetworkEngine alloc]init];
    MKNetworkOperation *operation = [engine operationWithURLString:@"https://upload.api.weibo.com/2/statuses/upload.json" params:dic httpMethod:@"POST"];
    //[operation addData:data forKey:@"pic" mimeType:@"image/jpg" fileName:@"33.jpg"];
    [operation addFile:path forKey:@"pic" mimeType:@"image/jpg"];
    [operation onUploadProgressChanged:^(double progress) {
        NSLog(@"%f",progress);
        uploadProgress.progress = progress;
    }];
    
    [engine enqueueOperation:operation];
上传图片最简单的方法是给出图片的路径,调用 addFile:path forKey:@"pic" mimeType:@"image/jpg"],将路径给它即可。同样调用 onUploadProgressChanged:^(double progress)也会实时返回上传进度。

冻结操作

可以确定的, MKNetworkKit的最又去的功能就是内置的冻结操作的功能。所有你需要做的就是设置请求操作为freezable,不用费任何力气!

[op setFreezable:YES];

冻结的操作会在网络不通时自动的被序列化并且上线后自动执行。想一下在离线时标记一条微博为喜欢然后稍后上线之后操作会自动执行。冻结的操作也会被持久化到磁盘当app进入后台之后。并且会在稍后app恢复之后自动执行。

缓存操作

MKNetworkKit默认缓存所有的请求。你需要做的仅仅是在你的Engine上打开缓存。当GET请求执行时,如果响应之前被缓存过,你的完成处理代码几乎是立即会被调用并传递缓存过的相应,要知道请求是否被缓存,调用isCachedResponse方法

 [operation onCompletion:^(MKNetworkOperation *completedOperation)
     {
         if([completedOperation isCachedResponse]) {
             DLog(@"Data from cache");
         }
         else {
             DLog(@"Data from server");
         }

         DLog(@"%@", [completedOperation responseString]);
     }onError:^(NSError* error) {

         errorBlock(error);
     }];

当你把一个operation放入一个队列中的时候,MKNetworkOperation就会调用start方法在start方法里

self.connection = [[NSURLConnectionalloc] initWithRequest:self.request

                                                        delegate:self

                                                startImmediately:NO];

创建了一个NSURLConnection并设置代理。请求之后调用代理方法。在接收请求数据时

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

将data数据放入了自身的属性里

[self.mutableDataappendData:data];


MKNetworkEngine类中

- (id) initWithHostName:(NSString*) hostName;

- (id) initWithHostName:(NSString*) hostName customHeaderFields:(NSDictionary*) headers;

- (id) initWithHostName:(NSString*) hostName apiPath:(NSString*) apiPath customHeaderFields:(NSDictionary*) headers;

- (id) initWithHostName:(NSString*) hostName portNumber:(int)portNumber apiPath:(NSString*) apiPath customHeaderFields:(NSDictionary*) headers;

有这几个初始化方法,hostName是ip加端口号,也可以写地址,但是地址不要加http://。跟下面的几个方法使用效果差不多:

-(MKNetworkOperation*) operationWithPath:(NSString*) path

                         params:(NSDictionary*) body;

-(MKNetworkOperation*) operationWithPath:(NSString*) path

                         params:(NSDictionary*) body

                   httpMethod:(NSString*)method;

-(MKNetworkOperation*) operationWithPath:(NSString*) path

                         params:(NSDictionary*) body

                   httpMethod:(NSString*)method 

                          ssl:(BOOL) useSSL;

-(MKNetworkOperation*) operationWithURLString:(NSString*) urlString;

-(MKNetworkOperation*) operationWithURLString:(NSString*) urlString

                                       params:(NSDictionary*) body;

-(MKNetworkOperation*) operationWithURLString:(NSString*) urlString

                              params:(NSDictionary*) body

                        httpMethod:(NSString*) method;

也可以取消请求调用:

+(void) cancelOperationsContainingURLString:(NSString*) string;

- (void) cancelAllOperations;

+(void) cancelOperationsMatchingBlock:(BOOL (^)(MKNetworkOperation*))block;

对于缓存方面 MKNetworkKit默认 不缓存你的请求,可以调用下面方法使用缓存

-(void) useCache;使用缓存

-(void) emptyCache;清空缓存




MKNetworkOperation类是一个独立的网络操作

初始化时可以给个请求

- (instancetype)initWithURLString:(NSString *)aURLString

                 params:(NSDictionary *)body

             httpMethod:(NSString *)method;


请求网络时token可以放到这个里面

-(void) setAuthorizationHeaderValue:(NSString*) token forAuthType:(NSString*) authType;

如果想发送一个图片可以调用下面的方法实现:

-(void) addFile:(NSString*) filePath forKey:(NSString*) key;(给出路径)

-(void) addFile:(NSString*) filePath forKey:(NSString*) key mimeType:(NSString*) mimeType;

-(void) addData:(NSData*) data forKey:(NSString*) key;(需要将文件转成data)

-(void) addData:(NSData*) data forKey:(NSString*) key mimeType:(NSString*) mimeType fileName:(NSString*) fileName;

请求完成(或失败)后会调用下列方法:

-(void) onCompletion:(MKNKResponseBlock) response onError:(MKNKErrorBlock) errorDEPRECATED_ATTRIBUTE;

-(void) addCompletionHandler:(MKNKResponseBlock) response errorHandler:(MKNKResponseErrorBlock) error;

-(void) onNotModified:(MKNKVoidBlock) notModifiedBlock;

在请求过程中会调用下列方法会显示请求的进度:

-(void) onUploadProgressChanged:(MKNKProgressBlock) uploadProgressBlock;

-(void) onDownloadProgressChanged:(MKNKProgressBlock) downloadProgressBlock;

可以通过流的方式上传数据调用

-(void) setUploadStream:(NSInputStream*) inputStream;

下载也有响应的流

-(void) addDownloadStream:(NSOutputStream*) outputStream;

判断是否有缓存

-(BOOL) isCachedResponse 如果有缓存,则先响应缓存,等请求来新数据后将新数据再次响应

请求数据的格式化

-(NSData*) responseData;将数据转成data对象

-(NSString*)responseString;将数据转成字符串对象

-(NSString*) responseStringWithEncoding:(NSStringEncoding) encoding;指定编码

-(UIImage*) responseImage;

-(NSXMLDocument*) responseXML;

-(id) responseJSON;

取消当前操作

-(void) cancel

当前操作是否完成

- (BOOL)isFinished

当前操作是否正在执行

- (BOOL)isExecuting

可以覆盖的方法

-(void) showLocalNotification

成功时调用

-(void) operationSucceeded

失败时调用

-(void) operationFailedWithError:(NSError*) error












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值