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 提供了一些如下便捷方法来方便你格式化你的响应数据
- responseData
- responseString
- responseJSON (ios5以上)
- responseImage
- responseXML
- 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];
- (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