IOS 网络并发请求

2017-12-04  本文已影响0人  叩首问路梦码为生

现在有一个需求:某个页面中的数据是通过三个接口给出的,现在需要三个接口中的数据全部返回后再一起展示全部数据。
需求分析:1.我们要将三个网络请求放在新开辟的子线程。 2.为了提高效率要将三个网络请求采用异步请求的方式。 3.要确保三个网络请求结束以后再进行展示数据的操作。
当遇到这样的需求的时候我们可以利用GCD中的组(group)来实现。我们将每个线程操作放到组中,在所有的线程操作完成之后回到主线程中进行UI页面的刷新。代码:

// 全局变量group
    dispatch_group_t group =dispatch_group_create();
    // 并行队列
    dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
    
    // 进入组(进入组和离开组必须成对出现,否则会造成死锁)
    dispatch_group_enter(group);
    dispatch_group_async(group, queue, ^{
        // 执行异步任务1
        [NSThreadsleepForTimeInterval:2];
        for (int i =0; i < 3; i ++) {
            NSLog(@"%d---%@", i, [NSThreadcurrentThread ]);    //子线程
        }
        _str1 =@"str1";
 dispatch_group_leave(group);
    });
   
    
    // 进入组
    dispatch_group_enter(group);
    dispatch_group_async(group, queue, ^{
        // 执行异步任务2
        [NSThreadsleepForTimeInterval:2];
        for (int i =3; i < 6; i ++) {
            NSLog(@"%d---%@", i, [NSThreadcurrentThread ]);
        }
        _str2 =@"str2";
        dispatch_group_leave(group);
    });
    
    
    dispatch_group_notify(group,dispatch_get_main_queue(), ^{
        NSLog(@"%@",_str1);
        NSLog(@"%@",_str2);
        NSLog(@"%@", [NSThreadcurrentThread]); //主线程
        NSLog(@"完成...");
    });

注意:代码中使用了dispatch_group_enter(group)和 dispatch_group_leave(group)是为了确保每个任务的完成,即使某个任务是异步的,在所有任务都完成后再执行notify中的代码。

方式二 :用 信号量检测

 // 创建信号量
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    // 创建全局并行
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{

        // 请求一
        [loginCode getUserInfoWithNick:nil andUserId:kUserId onSuc:^(id data) {
            NSLog(@"yue");
            dispatch_semaphore_signal(semaphore);

        } andFail:^(NSError *error) {       
        }];

    });
    dispatch_group_async(group, queue, ^{

        // 请求二
        [CommodityViewModel getPriceTransformForIntegral:nil onSuccess:^(id data) {

            NSLog(@"duihuan11");
            dispatch_semaphore_signal(semaphore);

        } onFailure:^(NSError *error) {
        }];
    });
    dispatch_group_async(group, queue, ^{

        // 请求三
        [CommodityViewModel getPriceTransformForIntegral:nil onSuccess:^(id data) {
            NSLog(@"duihuan22");
            dispatch_semaphore_signal(semaphore);

        } onFailure:^(NSError *error) {            
        }];
    });

    dispatch_group_notify(group, queue, ^{

        // 三个请求对应三次信号等待
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

        //在这里 进行请求后的方法,回到主线程
        dispatch_async(dispatch_get_main_queue(), ^{

            //更新UI操作

        });


    });

相关 文档 :http://blog.csdn.net/a454431208/article/details/77070778
http://blog.csdn.net/cloudox_/article/details/71107179

上一篇 下一篇

猜你喜欢

热点阅读