iOS AFNetWorking中block执行完后再执行其它操作

Posted ming1025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS AFNetWorking中block执行完后再执行其它操作相关的知识,希望对你有一定的参考价值。

需求:同时进行两次网络请求,网络请求是异步的,在网络请求成功后进行其它的操作。两个网络请求是这样,一个网络请求中block执行完之后,再进行其它操作,也是一样的原理,只是这时候不需要线程组了,只需要信号量。当然也适用于所有的block。

接下来就说下,在两次异步请求之后要做的操作。

利用线程组和信号量来完成,看代码

技术分享

- (void)getData

{

    NSString *appIdKey = @"8781e4ef1c73ff20a180d3d7a42a8c04";

    NSString* urlString_1 = @"http://api.openweathermap.org/data/2.5/weather";

    NSString* urlString_2 = @"http://api.openweathermap.org/data/2.5/forecast/daily";

    NSDictionary* dictionary [email protected]{

                                @"lat" : @"40.04991291",

                                @"lon" : @"116.25626162",

                                @"APPID" : appIdKey

                                };

 

    // 创建队列组,可以使两个网络请求异步执行,执行完之后再进行操作

    dispatch_group_t group = dispatch_group_create();

    

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        

        // 创建信号量

        dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

        AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

        [mgr GET:urlString_1 parameters:dictionary progress:^(NSProgress * _Nonnull downloadProgress) {

            

        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

            // 请求成功发送信号量(+1)

            dispatch_semaphore_signal(semaphore);

            

        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

            // 无论请求成功或失败都发送信号量(+1)

            dispatch_semaphore_signal(semaphore);

        }];

        

        // 在请求成功之前等待信号量(-1)

        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    });

    

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        

        // 创建信号量

        dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

        

        AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

        [mgr GET:urlString_2 parameters:dictionary progress:^(NSProgress * _Nonnull downloadProgress) {

            

        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

            // 发送信号量

            dispatch_semaphore_signal(semaphore);

        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

            // 发送信号量

            dispatch_semaphore_signal(semaphore);

        }];

        // 在请求成功之前等待信号量

        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    });

    

    // 请求完成之后

    dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        

    });

}

以上是关于iOS AFNetWorking中block执行完后再执行其它操作的主要内容,如果未能解决你的问题,请参考以下文章

iOS边练边学--Segue数据逆传(用block代替delegate)

iOS 简单易懂的 Block 回调使用和解析

iOS 面试题:block 什么时候需要构造循环引用 --转自唐巧

iOS 中常用的第三方开源库

iOS 中常用的第三方开源库

iOS - AFNetworking GET 方法中不兼容的块指针类型