Joke基本项目构建2 网络请求

2015-01-03  本文已影响110人  _赖笔小新

网络请求封装在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

上一篇 下一篇

猜你喜欢

热点阅读