GCD笔记之->Dispatch Group->0

如果想让追加到派发队列中的多个处理全部结束后执行一个操作,在只使用一个 serical Dispatch Queue时,这种情况比较好处理,但是使用Concurrent Dispatch Queue或者同时使用多个serical Dispatch Queue时源代码就非常复杂。

我们可以想一下生活中的例子:

例如周末,家中有三个serical Dispatch Queue:

1.微波炉按照步骤加热食物

2.洗碗机按照步骤洗涤碗筷

3.自己在按照步骤炒菜。

这三个serical Dispatch Queue都是为了吃午饭这个事情服务的,吃午饭必须在这三个队列中的多个处理全部结束后才能进行,那怎么办呢?

我们可以把这三件事放在一个大的“事件”中,让一个第三方的东西把这三者管理起来,在上面的例子里,这个大的“事件”就可以认为是吃午饭,这个吃午饭的事件,把三个队列都管理起来,而执行运维调度的,是负责这三件事的自己,调度方式依赖于自己的大脑。

在GCD的API里面,也有这种“队列集合”的角色,它就是Dispatch Group,我们看一段源码:

#define MAX_NUMBER 10000
#define TEST_QUEUE @"com.test.queue0"
#define TEST_QUEUE1 @"com.test.queue1"
#define TEST_QUEUE2 @"com.test.queue2"
#define TEST_QUEUE3 @"com.test.queue3"
#define TEST_QUEUE4 @"com.test.queue4"
#define C_QUEUE @"come.test.c.queue"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_group_t group=dispatch_group_create();
    dispatch_queue_t testQueue=dispatch_queue_create(TEST_QUEUE,NULL);
    dispatch_queue_t testQueue1=dispatch_queue_create(TEST_QUEUE1,NULL);
    dispatch_queue_t testQueue2=dispatch_queue_create(TEST_QUEUE2,NULL);
    dispatch_queue_t testQueue3=dispatch_queue_create(TEST_QUEUE3,NULL);
    dispatch_queue_t testQueue4=dispatch_queue_create(C_QUEUE, DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_async(group, testQueue, ^{
        NSLog(@"group0");
    });
    dispatch_group_async(group, testQueue1, ^{
        NSLog(@"group1");
    });
    dispatch_group_async(group, testQueue2, ^{
        NSLog(@"group2");
    });
    dispatch_group_async(group, testQueue3, ^{
        NSLog(@"group3");
    });
    dispatch_group_async(group, testQueue4, ^{
        NSLog(@"group4");
    });
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"输出完毕");
    });
    [self testQueue0:testQueue];
    [self testQueue1:testQueue1];
    [self testQueue2:testQueue2];
    [self testQueue3:testQueue3];
}
-(void)testQueueC:(dispatch_queue_t)testQueue{
   dispatch_async(testQueue, ^(){
        NSLog(@"细");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"草");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"微");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"风");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"岸");
    });

}
-(void)testQueue0:(dispatch_queue_t)testQueue{
   dispatch_async(testQueue, ^(){
        NSLog(@"0");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"1");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"2");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"3");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"4");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"5");
    });
}
-(void)testQueue1:(dispatch_queue_t)testQueue{
   dispatch_async(testQueue, ^(){
        NSLog(@"a");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"b");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"c");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"d");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"e");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"f");
    });
}
-(void)testQueue2:(dispatch_queue_t)testQueue{
   dispatch_async(testQueue, ^(){
        NSLog(@"A");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"B");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"C");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"D");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"E");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"F");
    });
}
-(void)testQueue3:(dispatch_queue_t)testQueue{
   dispatch_async(testQueue, ^(){
        NSLog(@"海");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"内");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"存");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"知");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"己");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"啊");
    });
}

@end

我们看几次执行的结果,第一组

2020-08-23 12:13:21.182718+0800 gcd0[25646:1045753] group1
2020-08-23 12:13:21.182745+0800 gcd0[25646:1045754] group0
2020-08-23 12:13:21.182789+0800 gcd0[25646:1045751] group2
2020-08-23 12:13:21.182773+0800 gcd0[25646:1045752] group3
2020-08-23 12:13:21.182815+0800 gcd0[25646:1045757] group4
2020-08-23 12:13:21.182893+0800 gcd0[25646:1045753] a
2020-08-23 12:13:21.182956+0800 gcd0[25646:1045754] 0
2020-08-23 12:13:21.182991+0800 gcd0[25646:1045751] A
2020-08-23 12:13:21.182989+0800 gcd0[25646:1045752] 海
2020-08-23 12:13:21.183002+0800 gcd0[25646:1045753] b
2020-08-23 12:13:21.183086+0800 gcd0[25646:1045754] 1
2020-08-23 12:13:21.183398+0800 gcd0[25646:1045751] B
2020-08-23 12:13:21.183618+0800 gcd0[25646:1045752] 内
2020-08-23 12:13:21.183813+0800 gcd0[25646:1045751] C
2020-08-23 12:13:21.184012+0800 gcd0[25646:1045752] 存
2020-08-23 12:13:21.184264+0800 gcd0[25646:1045751] D
2020-08-23 12:13:21.184511+0800 gcd0[25646:1045752] 知
2020-08-23 12:13:21.184706+0800 gcd0[25646:1045751] E
2020-08-23 12:13:21.184927+0800 gcd0[25646:1045752] 己
2020-08-23 12:13:21.185194+0800 gcd0[25646:1045751] F
2020-08-23 12:13:21.185434+0800 gcd0[25646:1045752] 啊
2020-08-23 12:13:21.186349+0800 gcd0[25646:1045754] 2
2020-08-23 12:13:21.186777+0800 gcd0[25646:1045753] c
2020-08-23 12:13:21.187066+0800 gcd0[25646:1045754] 3
2020-08-23 12:13:21.187516+0800 gcd0[25646:1045753] d
2020-08-23 12:13:21.188025+0800 gcd0[25646:1045754] 4
2020-08-23 12:13:21.188481+0800 gcd0[25646:1045753] e
2020-08-23 12:13:21.188965+0800 gcd0[25646:1045754] 5
2020-08-23 12:13:21.189161+0800 gcd0[25646:1045753] f
2020-08-23 12:13:21.197965+0800 gcd0[25646:1045614] 输出完毕

第二组: 

2020-08-23 12:14:12.334466+0800 gcd0[25660:1046846] group0
2020-08-23 12:14:12.334477+0800 gcd0[25660:1046841] group1
2020-08-23 12:14:12.334497+0800 gcd0[25660:1046843] group3
2020-08-23 12:14:12.334512+0800 gcd0[25660:1046842] group4
2020-08-23 12:14:12.334507+0800 gcd0[25660:1046844] group2
2020-08-23 12:14:12.334606+0800 gcd0[25660:1046846] 0
2020-08-23 12:14:12.334610+0800 gcd0[25660:1046841] a
2020-08-23 12:14:12.334652+0800 gcd0[25660:1046843] 海
2020-08-23 12:14:12.334658+0800 gcd0[25660:1046844] A
2020-08-23 12:14:12.334701+0800 gcd0[25660:1046846] 1
2020-08-23 12:14:12.334740+0800 gcd0[25660:1046841] b
2020-08-23 12:14:12.335042+0800 gcd0[25660:1046843] 内
2020-08-23 12:14:12.335284+0800 gcd0[25660:1046844] B
2020-08-23 12:14:12.335521+0800 gcd0[25660:1046843] 存
2020-08-23 12:14:12.335700+0800 gcd0[25660:1046844] C
2020-08-23 12:14:12.336007+0800 gcd0[25660:1046843] 知
2020-08-23 12:14:12.336252+0800 gcd0[25660:1046844] D
2020-08-23 12:14:12.336542+0800 gcd0[25660:1046843] 己
2020-08-23 12:14:12.336722+0800 gcd0[25660:1046844] E
2020-08-23 12:14:12.336897+0800 gcd0[25660:1046843] 啊
2020-08-23 12:14:12.337112+0800 gcd0[25660:1046844] F
2020-08-23 12:14:12.337734+0800 gcd0[25660:1046841] c
2020-08-23 12:14:12.337984+0800 gcd0[25660:1046846] 2
2020-08-23 12:14:12.338220+0800 gcd0[25660:1046841] d
2020-08-23 12:14:12.338455+0800 gcd0[25660:1046846] 3
2020-08-23 12:14:12.338872+0800 gcd0[25660:1046841] e
2020-08-23 12:14:12.339209+0800 gcd0[25660:1046846] 4
2020-08-23 12:14:12.339396+0800 gcd0[25660:1046841] f
2020-08-23 12:14:12.339601+0800 gcd0[25660:1046846] 5
2020-08-23 12:14:12.349478+0800 gcd0[25660:1046724] 输出完毕

我们可以看出NSLog(@"输出完毕");一定会最后执行。

无论向什么样的派发队列中追加处理,使用Dispatch Group 都可以监视这些处理执行的结束,一旦检测到所有处理执行结束,就可以将结束的处理(如NSLog(@"输出完毕");)追加到派发队列中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值