MKNetworkKit实例解析(二)

本文详细介绍了如何使用MKNetworkKit进行iOS开发中的网络操作,包括上传图片、下载文件到本地目录、缓存图片的缩略图,并探讨了操作的缓存、冻结特性以及获取不同格式响应数据的方法。
摘要由CSDN通过智能技术生成

实例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 类型匹配。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值