iOS多线程--GCD同步并行任务

问题

iOS多线程--GCD同步并行任务_第1张图片

如何用GCD实现图中要求:任务1、2、3并行;任务0等1、2、3都结束后执行;任务4、5、6并行并且等任务0结束后才执行 ?

方法一:group

dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, globalQueue, ^{
        NSLog(@"任务 1");
    });
dispatch_group_async(group, globalQueue, ^{
        NSLog(@"任务 2");
    });
dispatch_group_async(group, globalQueue, ^{
        NSLog(@"任务 3");
    });

dispatch_group_t group2 = dispatch_group_create();
//手动管理Group计数,必须配套dispatch_group_leave,计数减为零则触发Notifiy;否则依赖该Group的block会直接执行
dispatch_group_enter(group2); 
dispatch_group_notify(group, globalQueue, ^{
        dispatch_async(globalQueue, ^{
            NSLog(@"任务 0");
            dispatch_group_leave(group2);
        });
    });

dispatch_group_notify(group2, globalQueue, ^{
        dispatch_async(globalQueue, ^{
            NSLog(@"任务 4");
        });
        dispatch_async(globalQueue, ^{
            NSLog(@"任务 5");
        });
        dispatch_async(globalQueue, ^{
            NSLog(@"任务 6");
        });
    });

方法二:barrier

    dispatch_queue_t cocurrentQueue = dispatch_queue_create("concurrent queue", DISPATCH_QUEUE_CONCURRENT);
   dispatch_async(cocurrentQueue, ^{
        NSLog(@"任务 1");
    });
    dispatch_async(cocurrentQueue, ^{
        NSLog(@"任务 2");
    });
    dispatch_async(cocurrentQueue, ^{
        NSLog(@"任务 3");
    });
    dispatch_barrier_async(cocurrentQueue, ^{
        NSLog(@"任务 0");
    });
    dispatch_async(cocurrentQueue, ^{
        NSLog(@"任务 4");
    });
    dispatch_async(cocurrentQueue, ^{
        NSLog(@"任务 5");
    });
   dispatch_async(cocurrentQueue, ^{
        NSLog(@"任务 6");
    });

注意:barrier常配合并行队列,但只是对自己创建的并行队列有效,对于系统提供的全局并行队列无效,可能苹果是出于安全考虑而做了特殊处理

你可能感兴趣的:(iOS多线程--GCD同步并行任务)