• 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中完成数据的处理和界面的刷新

  • 相关阅读:
    2015年秋季阅读计划
    课程改进意见
    第二阶段冲刺站立会议报告四
    第二阶段冲刺站立会议报告三(补)
    第二阶段冲刺站立会议报告二(补)
    第二阶段冲刺站立会议报告一(补)
    第一阶段冲刺站立会议报告四(补)
    第一阶段冲刺站立会议报告三(补)
    第一阶段冲刺站立会议报告二(补)
    第一阶段冲刺站立会议报告一(补)
  • 原文地址:https://www.cnblogs.com/qqcc1388/p/8662184.html
Copyright © 2020-2023  润新知