美文网首页
Joke基本项目构建2 网络请求

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

作者: _赖笔小新 | 来源:发表于2015-01-03 15:39 被阅读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

    相关文章

      网友评论

          本文标题:Joke基本项目构建2 网络请求

          本文链接:https://www.haomeiwen.com/subject/icwztttx.html