通过之前的学习,我大概也知道了在ios开发中框架是一种多么神奇且便利的存在。
同样,在进行网络请求时也有十分简单易用的网络请求框架可以使用,其中MKNetworkKit就是一个优秀的轻量级网络请求框架。
使用过程比较简单,具体根据以下方法配制:
1.从https://github.com/MugunthKumar/MKNetworkKit下载并解压MKNetworkKit框架。
2.将MKNetworkKit文件夹添加到工程中。
3.在工程中添加如下几个支持类库或框架:
CFNetwork.Framework
SystemConfiguration.framework
Security.framework
4.添加预编译头文件,其内容如下:
#ifndef MKNetworkKit_Demo_PrefixHeader_pch
#define MKNetworkKit_Demo_PrefixHeader_pch
#import <Foundation/Foundation.h>
完成以上几步的配置之后,工程目录结构如下:
红框中的内容就是我们需要配制添加的。
完成如上步骤之后,剩下的工作就比较简单了,MKNetworkKit框架中也支持GET、POST方法的请求。其使用过程中的主要代码如下:
- (void)startRequest{
//设置GET请求名,请求名中不需包括主机名
// NSString* path = [NSString stringWithFormat:@"/service/mynotes/WebService.php?email=%@&type=%@&action=%@",@"注册邮箱",@"JSON",@"query"];
//设置POST方法请求名
NSString* path = [NSString stringWithFormat:@"/service/mynotes/WebService.php"];
//设置POST方法请求中的参数
NSMutableDictionary* param = [[NSMutableDictionary alloc] init];
[param setValue:@"注册邮箱" forKey:@"email"];
[param setValue:@"JSON" forKey:@"type"];
[param setValue:@"query" forKey:@"action"];
//以主机名实例化MKNetworkEngine,其中主机名不用包括http协议及www等
MKNetworkEngine* engine = [[MKNetworkEngine alloc] initWithHostName:@"51work6.com" customHeaderFields:nil];
//实例化GEI方法操作类
// MKNetworkOperation* op = [engine operationWithPath:path];
//实例化POST方法操作类
MKNetworkOperation* op = [engine operationWithPath:path params:param httpMethod:@"POST"];
[op addCompletionHandler:^(MKNetworkOperation* operation){
//添加闭包方法,请求成功时调用
NSData* data = [operation responseData];
NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
[self reloadView:dict];
}errorHandler:^(MKNetworkOperation* operation, NSError* error){
//添加闭包函数,请求失败时调用
NSLog(@"请求错误 : %@",[error localizedDescription]);
}];
//发送请求
[engine enqueueOperation:op];
}
以上是使用MKNetworkKit进行网络请求所要使用的主要代码。
同时,使用该框架进行上传下载文件操作也十分方便,下面列出下载操作使用的主要代码,上传操作与之类似。
- (IBAction)goButton:(id)sender {
//获取沙箱目录中的cache路径
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString* cachePath = paths[0];
NSString* downloadPath = [cachePath stringByAppendingString:@"/test1.jpg"];
NSString* path = [NSString stringWithFormat:@"/service/download.php?email=%@&FileName=test1.jpg",@"注册邮箱"];
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//实例化请求及操作类
MKNetworkEngine* engine = [[MKNetworkEngine alloc] initWithHostName:@"51work6.com" customHeaderFields:nil];
MKNetworkOperation* op = [engine operationWithPath:path params:nil httpMethod:@"POST"];
//设置下载目录及进度监控
[op addDownloadStream:[NSOutputStream outputStreamToFileAtPath:downloadPath append:NO]];
[op onDownloadProgressChanged:^(double progress){
NSLog(@"download progress: %.2f%%",progress*100);
self.progressView.progress = progress;
}];
[op addCompletionHandler:^(MKNetworkOperation* operation){
NSLog(@"download finish");
NSData* data = [operation responseData];
if (data) {
//有返回值说明下载图片出错
NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
if (!dict) {
NSNumber* resultCode = [dict objectForKey:@"ResultCode"];
NSString* errStr = [resultCode errorMessage];
UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"出错信息" message:errStr delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
}
}else{
//接受图片成功
UIImage* img = [UIImage imageWithContentsOfFile:downloadPath];
self.imageView.image = img;
}
}errorHandler:^(MKNetworkOperation* operation, NSError* error){
NSLog(@"请求错误:%@",[error localizedDescription]);
}];
[engine enqueueOperation:op];
}
上传操作与之类似,但是需要两句额外的代码如下:
//上传文件所需操作
//filePath代表上传文件的路径
[op addFile:filePath forKey:@"file"];
//setFreezable是冻结方法,该方法可以在网络不通时将数据暂存本地,当上线时自动上传所保存的数据
[op setFreezable:YES];