iOS 多网络请求同步并发

iOS中经常会用到多线程,在多线程中有一个线程组的概念(group),创建多个线程组任务,多组任务都完成之后,就会进入dispatch_group_notify队列中。
同时多线程中还有一个信号量的概念(semaphore),信号量常用的方法有3个:

dispatch_semaphore_create 创建一个semaphore  
dispatch_semaphore_signal 发送一个信号
dispatch_semaphore_wait 等待信号

执行dispatch_semaphore_create创建信号量并初始化信号值
dispatch_semaphore_signal 发送一个信号,信号量的信号值+1
dispatch_semaphore_wait 当信号量的值≤0时,执行等待,信号量的值>0时,则继续向下执行,并将信号量-1
在实际开发中经常会用到多网络请求并行,最后又需要统一处理请求结果这样的需求,这里就可以利用GCD的这些特点来完成。

    //创建group
    dispatch_group_t group = dispatch_group_create();

    //创建GCD组
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //创建信号量 并初始化信号量值为0
        dispatch_semaphore_t  sema = dispatch_semaphore_create(0);
        [HttpRequestUtil GET:Action_Home_Adv parameters:@{@"spaceId":@"1"} finished:^(AjaxResult *result) {
            if (result.code == AjaxResultStateSuccess) {
                
            }
            dispatch_semaphore_signal(sema);
        }];
        //由于信号量初始化值为0,所有当第一次执行到这里的时候信号量值仍然为0,程序就开始在这里等待信号量变化,前面异步的网络请求结束后,执行了dispatch_semaphore_signal(sema)方法,信号量+1,这样,dispatch_semaphore_wait监听到信号量由0变为1后,跳出等待,并且结束当前group队列
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    });

当多个gcd_group都被执行完毕,所有的组都已经完成之后,根据GCD_Group的特点,会执行dispatch_group_notify这个队列

    //把group_notify放在主队列中,这样可以在这个队列中刷新UI
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

    });

整体的思路就是利用GCD通过dispatch_group + 信号量来实现的。
通过group把多个请求分组,然后依次完成每个请求,当所有请求都有请求完成 会进入group_notify中,同时利用semaphore信号量的特点确保每个group执行完毕后,里面的网络请求也是请求完成的,最终在group_notify中完成数据的处理和界面的刷新

原文地址:https://www.cnblogs.com/qqcc1388/p/8662184.html