zoukankan      html  css  js  c++  java
  • iOS AFNetWorking中block执行完后再执行其它操作

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

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

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

    copycode.gif

    - (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 =@{

                                    @"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), ^{

            

        });

    }

  • 相关阅读:
    JAVA笔记整理-数组
    JAVA笔记整理-流程控制-关键字 break、continue 、return的区别
    JAVA笔记整理-流程控制-循环
    Razor语法和Razor引擎大全
    MVC中几种常用ActionResult
    DataInputStream&DataOutputStream---操作基本类型值的流
    PipedOutputStream&PipedInputStream---管道流
    RandomAccessFile--随机访问文件
    ObjectOutputStream&ObjectInputStream--对象流
    SequenceInputStream--序列流
  • 原文地址:https://www.cnblogs.com/ming1025/p/6134846.html
Copyright © 2011-2022 走看看