网络请求封装在JKNetworkUtil类中。没有使用流行的AFNetworking,而是用NSURLConnection。
为了获取糗事百科的消息列表,我们需要得到对应的URL请求地址和参数。我直接从Joke-Swift copy过来。
最热列表
http://m2.qiushibaike.com/article/list/suggest?count=20&page=
最新列表
http://m2.qiushibaike.com/article/list/latest?count=20&page=
真相列表
http://m2.qiushibaike.com/article/list/imgrank?count=20&page=
有了地址我们就可以发出请求传,然后接收数据进行展示了
下面我们看看怎么发出请求
网络请求对应的类是NSURLRequest
,实例化NSURLRequest需要一个URL类型。
实例化一个URL
NSURL * url = [[NSURL alloc]initWithString:[NSString stringWithFormat:@"%@%ld", @"http://m2.qiushibaike.com/article/list/suggest?count=20&page=", (long)pageNo]];
很简单,接着实例化NSURLRequest
NSURLRequest * request = [[NSURLRequest alloc]initWithURL:url];
接着试图发出请求,但是发现还需要一个NSOperationQueue。看它的定义
+ (void)sendAsynchronousRequest:(NSURLRequest*) request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler NS_AVAILABLE(10_7, 5_0);
这个参数跟异步有关,具体信息可以查看并发编程:API及挑战
那我们就实例化一个NSOperationQueue
NSOperationQueue * queue = [[NSOperationQueue alloc]init];
最后的请求是这样的:
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
}];
completionHandler
是一个block。用来处理请求结果。
if (connectionError) {
if (failure) {
dispatch_async(dispatch_get_main_queue(), ^{
failure();
});
NSLog(@"connection error : %@", connectionError.localizedDescription);
}
}else {
NSDictionary * jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
success(jsonData);
});
}
}
我首先判断是否有请求错误发生,如果connectionError
不为空,那么就是发生了错误,调用failure这个block。failure是外部传进来的错误处理block。
else部分是成功的处理逻辑,我们把返回的数据:data进行json序列化,因为糗事百科服务器返回的就是json传。结果就是得到一个NSDictionary。同样的这边会调用success这个外部block来处理成功的情况。
可以发现在调用failure 和 success的时候都会用
dispatch_async(dispatch_get_main_queue(), ^{
// failure 和 success
});
这是gcd写法,目的是把大括号内的代码放到主线程中执行。
具体可以clone我的项目自己试验,地址是GitHub
网友评论