• 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 =@{
                                    @"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), ^{
            
        });
    }
  • 相关阅读:
    mysql 之 union 分类: database 测试 2014-02-12 11:59 218人阅读 评论(0) 收藏
    MySql模糊查询like通配符使用详细介绍 分类: database 测试 2014-02-12 10:19 6829人阅读 评论(1) 收藏
    sed(查找替换) 与awk(提取字段) 分类: ubuntu 测试 2014-02-11 12:08 4074人阅读 评论(0) 收藏
    Linux命令行uniq 分类: ubuntu 测试 2014-02-10 17:52 341人阅读 评论(0) 收藏
    n&1判断奇偶 分类: python基础学习 测试 2014-02-10 15:41 636人阅读 评论(0) 收藏
    vue-cli安装
    input事件
    Edusohu搭建
    Ngxin代理服务基本概述
    五种IO模型---转载
  • 原文地址:https://www.cnblogs.com/peaker-wu/p/5364753.html
Copyright © 2020-2023  润新知