既然看到本文章,至少你已经对MKNetworkKit不是太陌生了。那就废话少说,直接上代码。
一、使用前的步骤
二、上代码
OK,切入正题。
由于关于API接口,我个人是比较尊重他人隐私的,这里就用假的,我会解说。
例如一个接口:http://www.blockXiaofan.com/blockXiaofanAPIpath?&y=you&m=me&h=he
我们首先来分解这个URL
其中: 域名: http://www.blockXiaofan.com,(貌似在xcode5.1.1的时候,请求的域名要改为www.blockXiaofan.com)
API地址: blockXiaofanAPIpath
请求参数(也就是params): &y=you&m=me&h=he (参数是key、value值展现的,中间使用&连接起来)
除此之外还有请求头,和post请求时需要的请求体
上代码
- (void)loadData
{
__weak RecommendViewController *this = self;
_arrayData = [[NSMutableArray alloc]init];
[ZMKDataservice requestWithHostName:HOST_NAME apiPath:nil headerField:nil URLString:PATHURL_RECOM_HEADER params:nil httpMethod:@"GET" ssl:NO block:^(id result) {
__strong RecommendViewController *strongSelf = this;
NSDictionary *JsonDic = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingMutableContainers error:nil];
NSArray *array = [JsonDic objectForKey:@"data"];
for (NSDictionary *dic in array) {
RecomModel *recomModel = [[RecomModel alloc]initContentWithDic:dic];
[strongSelf.arrayData addObject:recomModel];
_collectionView.array = strongSelf.arrayData;
}
}];
}
这是我实现将请求下来的数据封装为model数组传给视图时,网络请求的所有代码。
__weak 是因为ARC,然后就是初始化可变数组,然后是我的类方法请求数据,里面有HostName(域名),apiPath(API地址),headerField(请求头),URLString(URL,本人比较懒,直接将API地址与参数混搭在一起,直接写在URL里请求就行了),params(请求参数),httpMethod(请求方式),ssl(是否加密访问),block(回调结果)
请求下来的数据我先定为id类型,一般来说都是二进制数据流,我用的是系统自带的JSON解析方法,5.0之前可以使用jsonKit等。这点根据自己的需要来自己编写。
下面就是我封装好的完完整整的类了,在.h文件中还有要自己声明一个block,然后在方法名中实现,在用的地方调用
typedef void(^CompletionLoad)(id result);
+ (MKNetworkEngine *)requestWithHostName:(NSString *)hostName
apiPath:(NSString *)apiPath
headerField:(NSDictionary *)header
URLString:(NSString *)URLString
params:(NSDictionary *)params
httpMethod:(NSString *)httpMethod
ssl:(BOOL)isBOOL
block:(CompletionLoad)block
{
/**
*如果路径中包含中文,则需要转成专门用于URL的编码格式格式,有些服务器的编码可能有所不同 ----很重要------
*/
URLString = [URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//
MKNetworkEngine *engine = [[MKNetworkEngine alloc]initWithHostName:hostName apiPath:apiPath customHeaderFields:header];
MKNetworkOperation *operation = [engine operationWithPath:URLString params:params httpMethod:httpMethod ssl:isBOOL];
//处理数据
[operation addCompletionHandler:^(MKNetworkOperation *completedOperation) {
if (block != nil) {
block([completedOperation responseData]);
}
} errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
NSLog(@"Error:%@",completedOperation.error);
if (block == nil) {
block(error);
}
}];
//发送请求
[engine enqueueOperation:operation];
return engine;
}
这个类封装的其实不是太好,还有很多改进,比如说冷冻机制,还有数据持久化的什么没有弄好,但是再过几天准备要去面试,时间紧,赶项目,回头补上......