实例2:上传图片到服务器的实例
1)在这里我们要注意的是,上传图片,需要 operation 能编码 multi-part 表单数据。MKNetworkKit 框架使用类似 ASIHttpRequest 的方式。 我们可以非常简单地通过MKNetworkOperation 的 addFile:forKey:方法将一个文件作为请求中的 multi-part 表单数据提交。如下代码所示。
2)如果不用表单数据,MKNetworkOperation 也有一个方法,可以将图片以 NSData 的方式提交。即addData:forKey: 方法,它可以将图片以NSData 的方法上传到服务器。 (例如直接从相机中捕获的图片)
//上传图片
-(MKNetworkOperation*)uploadImageFromFile:(NSString*) file
completionHandler:(IDBlock) completionBlock
errorHandler:(MKNKErrorBlock) errorBlock {
MKNetworkOperation *op = [selfoperationWithPath:@"upload.php"
params:@{@"Submit": @"YES"}
httpMethod:@"POST"];
//addFile:forKey:方法将图片文件作为请求中的表单数据提交
[op addFile:file forKey:@"image"];
// setFreezable uploads your images afterconnection is restored!
//冻结操作,op对象在网络被断开时自动序列化并在网络恢复后自动执行
[op setFreezable:YES];
//指定请求代码块
//设置成功block
[opaddCompletionHandler:^(MKNetworkOperation* completedOperation) {
NSString *xmlString = [completedOperationresponseString];
DLog(@"%@", xmlString);
completionBlock(xmlString);
}
//设置出错block
errorHandler:^(MKNetworkOperation *errorOp,NSError* error) {
errorBlock(error);
}];
//添加到共享队列,发起网络请求
[self enqueueOperation:op];
return op;
}
实例3:下载文件到本地目录实例(缓存)
使用MKNetworkKit 从服务器下载文件并保存到 iPhone 的本地目录非常简单。只需要设置 MKNetworkOperation的 outputStream即可 。
//下载文件
-(MKNetworkOperation*)downloadFatAssFileFrom:(NSString*) remoteURL toFile:(NSString*)filePath {
MKNetworkOperation *op = [self operationWithURLString:remoteURL];
//指定下载流
[op addDownloadStream:[NSOutputStream outputStreamToFileAtPath:filePath append:YES]];
[self enqueueOperation:op];
returnop;
}
[注]:可以设置多个 outputStream 到一个 operation,将同一文件保存到几个地方(例如其中一个用作缓存目录,另一个用作工作目录)。
实例4:缓存图片的缩略图
对于下载图片,可能需要提供一个绝对 URL 地址而不是一个路径。 MKNetworkEngine 的operationWithURLString:params:httpMethod: 方法根据绝对 URL地址来创建网络线程。
MKNetworkEngine会将同一个 URL 的多次 GET 请求合并成一个,当 operation 完成时它会通知所有的块。这显著提升了抓取图片 URL 以渲染缩略图的速度。
我们需要子类化 MKNetworkEngine然后覆盖图片的缓存目录及缓存的大小。如果不想定制这二者,也可以直接调用 MKNetworkEngine中的方法来下载图片。推荐这种方式。
缓存operation
MKNetworkKit默认会缓存所有请求。我们所需要的仅仅是在自己的 engine 中打开它。当执行一个 GET 请求时,如果上次的 response 已缓存,相应的 completion 块将用缓存的response 进行调用(瞬间)。要想知道 response 是否缓存,可以调用 isCachedResponse 方法,如下所示:
[oponCompletion:^(MKNetworkOperation *completedOperation) {
if([completedOperationisCachedResponse]) {
DLog(@"Datafrom cache");
}else {
DLog(@"Datafrom server");
}
DLog(@"%@", [completedOperationresponseString]);
}
冻结operation
MKNetworkKit的一个最有趣的特性是它内置的冻结 operation 特性。只需要设置 operation 的 freeesable 属性就可以。
[opsetFreezable:YES];
冻结是指 operation 在网络被断开时自动序列化并在网络恢复后自动执行。例如当离线时也能够进行收藏tweet 的操作,然后在再次上线时 operation 自动恢复执行。
在应用程序进入后台时,冻结的 operation 也会被持久化到磁盘。然后在应用程序回到前台后自动恢复执行。
MKNetworkOperation中的一些实用的方法
如下所示,MKNetworkOperation 公开了一些有用的方法,你可从中获取各种格式的response 数据:
1. responseData
2. responseString
3. responseJSON(Only on iOS 5)
4. responseImage
5. responseXML
6. error
当 operation 执行完时,这些方法被用于获取响应数据。如果格式不正确,方法会返回nil。例如,响应的数据明明是一个 HTML 格式,你用 responseImage 方法只会得到 nil。只有 responseData 能保证无论什么格式都返回正确,而其他方法你必须确保和相应的repsone 类型匹配。