iOS 底层 多线程 队列组应用 - AlvinSunny/OC-TheUnderlying GitHub Wiki

写在前面,队列可分为:串行队列和并发队列

队列组是什么 ?

队列组就是把多个队列组合起来使用。

用队列组来解决一下问题

如何用GCD实现以下功能:

  • 异步并发执行任务1、任务2
  • 等任务1、任务2都执行完毕后,在回到主线程执行任务3

利用组队列

- (void)test
{
   //1. 创建队列组
    dispatch_group_t group = dispatch_group_create();

    //2. 两种创建方式
    dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
    //    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

   //3. 异步并发执行任务1、任务2
    dispatch_group_async(group, queue, ^{
        NSLog(@"任务1 - %@",[NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"任务2 - %@",[NSThread currentThread]);
    });

    //4. 等任务1、任务2都执行完毕后,在回到主线程执行任务3
    dispatch_group_notify(group, queue, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"任务3 - %@",[NSThread currentThread]);
        });
    });
    
}

执行结果@2x.png

ABC执行完后 D依赖AB E依赖BC F依赖DE

dispatch_group_enter/dispatch_group_leave的真正用法 设置GCD依赖

  • 先用dispatch_group_create 函数获取3个group
  • 并行的任务放到一个组, AB加入g1 BC加入g2 DE加入g3
  • 依赖项D利用函数dispatch_group_notify函数等待被依赖AB所在的group执行完毕
+ (void)test2 {

    dispatch_group_t g1 = dispatch_group_create();
    dispatch_group_t g2 = dispatch_group_create();
    dispatch_group_t g3 = dispatch_group_create();
    
    dispatch_group_enter(g1);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for(int i = 0; i < 3; i++){
            NSLog(@"----A----");
        }
        dispatch_group_leave(g1);
    });
    
    dispatch_group_enter(g1);
    dispatch_group_enter(g2);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for(int i = 0; i < 3; i++){
            NSLog(@"----B----");
        }
        dispatch_group_leave(g1);
        dispatch_group_leave(g2);
    });
    
    dispatch_group_enter(g2);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for(int i = 0; i < 3; i++){
            NSLog(@"----C----");
        }
        dispatch_group_leave(g2);
    });
    
    dispatch_group_enter(g3);
    dispatch_group_notify(g1, dispatch_get_global_queue(0, 0), ^{
        for(int i = 0; i < 3; i++){
            NSLog(@"----D----");
        }
        dispatch_group_leave(g3);
    });;
    
    dispatch_group_enter(g3);
    dispatch_group_notify(g2, dispatch_get_global_queue(0, 0), ^{
        for(int i = 0; i < 3; i++){
            NSLog(@"----E----");
        }
        dispatch_group_leave(g3);
    });
    
    dispatch_group_notify(g3, dispatch_get_global_queue(0, 0), ^{
        for(int i = 0; i < 3; i++){
            NSLog(@"----F----");
        }
    });
    
}



打印结果:

----A----
----B----
----C----
----A----
----B----
----C----
----A----
----C----
----B----
----D----
----E----
----D----
----E----
----D----
----E----
----F----
----F----
----F----