美文网首页
GCD--group

GCD--group

作者: 初灬终 | 来源:发表于2018-12-01 11:55 被阅读4次

场景一:a,b,c,d,e五个耗时任务,c依赖于a,b的结果,d,e依赖于c的结果。

void 
dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block);
#dispatch_group_t group 执行任务的调度组
#dispatch_queue_t queue 执行任务的队列
#dispatch_block_t block 被执行的任务

方式一

简单使用dispatch_group_async

    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queueA = dispatch_queue_create("queueA", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_async(group, queueA, ^{
        for (int i=0; i<3; i++) {
            sleep(1);
            NSLog(@"queueA i = %d", i);
        }
    });
    dispatch_group_async(group, queueA, ^{
        for (int j=0; j<3; j++) {
            sleep(1);
            NSLog(@"queueA j = %d", j);
        }
    });
    dispatch_queue_t queueB = dispatch_queue_create("queueB", DISPATCH_QUEUE_SERIAL);
    dispatch_group_async(group, queueB, ^{
        for (int m=0; m<5; m++) {
            sleep(1);
            NSLog(@"queueB m = %d", m);
        }
    });
    dispatch_group_async(group, queueB, ^{
        for (int n=0; n<3; n++) {
            sleep(1);
            NSLog(@"queueB n = %d", n);
        }
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"all finished");
    });

输出结果

2018-12-01 20:54:28.111987+0800 dispatch_group-Demo[47564:2174856] queueA i = 0
2018-12-01 20:54:28.112019+0800 dispatch_group-Demo[47564:2175111] queueA j = 0
2018-12-01 20:54:28.111987+0800 dispatch_group-Demo[47564:2174855] queueB m = 0
2018-12-01 20:54:29.116968+0800 dispatch_group-Demo[47564:2175111] queueA j = 1
2018-12-01 20:54:29.117005+0800 dispatch_group-Demo[47564:2174856] queueA i = 1
2018-12-01 20:54:29.117005+0800 dispatch_group-Demo[47564:2174855] queueB m = 1
2018-12-01 20:54:30.119874+0800 dispatch_group-Demo[47564:2174855] queueB m = 2
2018-12-01 20:54:30.119874+0800 dispatch_group-Demo[47564:2175111] queueA j = 2
2018-12-01 20:54:30.119901+0800 dispatch_group-Demo[47564:2174856] queueA i = 2
2018-12-01 20:54:31.120646+0800 dispatch_group-Demo[47564:2174855] queueB n = 0
2018-12-01 20:54:32.124793+0800 dispatch_group-Demo[47564:2174855] queueB n = 1
2018-12-01 20:54:33.128510+0800 dispatch_group-Demo[47564:2174855] queueB n = 2
2018-12-01 20:54:33.128792+0800 dispatch_group-Demo[47564:2168009] all finished

很明显,在group中的队列,任务都执行完毕了,才会执行dispatch_group_notify里的任务。

方式二

dispatch_group_enter + dispatch_group_leave + dispatch_group_notify

    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_apply(10, queue, ^(size_t n) {
        dispatch_group_enter(group);
        dispatch_group_async(group, queue, ^{
            int i = arc4random()%10;
            sleep(i);
            NSLog(@"%zuth thread sleep %d seconds",n,i);
            dispatch_group_leave(group);
        });
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"all finished");
    });

输出结果

2018-12-01 20:54:53.573643+0800 dispatch_group-Demo[47564:2176026] 7th thread sleep 0 seconds
2018-12-01 20:54:54.576867+0800 dispatch_group-Demo[47564:2176021] 0th thread sleep 1 seconds
2018-12-01 20:54:55.575458+0800 dispatch_group-Demo[47564:2176025] 6th thread sleep 2 seconds
2018-12-01 20:54:56.575312+0800 dispatch_group-Demo[47564:2176027] 8th thread sleep 3 seconds
2018-12-01 20:54:57.575330+0800 dispatch_group-Demo[47564:2175110] 2th thread sleep 4 seconds
2018-12-01 20:54:57.575384+0800 dispatch_group-Demo[47564:2176028] 9th thread sleep 4 seconds
2018-12-01 20:54:58.575398+0800 dispatch_group-Demo[47564:2176022] 1th thread sleep 5 seconds
2018-12-01 20:54:59.577020+0800 dispatch_group-Demo[47564:2176024] 5th thread sleep 6 seconds
2018-12-01 20:55:01.575419+0800 dispatch_group-Demo[47564:2176023] 4th thread sleep 8 seconds
2018-12-01 20:55:02.578179+0800 dispatch_group-Demo[47564:2176015] 3th thread sleep 9 seconds
2018-12-01 20:55:02.578576+0800 dispatch_group-Demo[47564:2168009] all finished

方式三

dispatch_group_enter + dispatch_group_leave + dispatch_group_wait

    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_queue_create("jiang", DISPATCH_QUEUE_CONCURRENT);
    dispatch_apply(10, queue, ^(size_t n) {
        dispatch_group_enter(group);
        dispatch_group_async(group, queue, ^{
            int i = arc4random()%10;
            sleep(i);
            NSLog(@"%zuth thread sleep %d seconds",n,i);
            dispatch_group_leave(group);
        });
    });
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"all finished");
    });

输出结果

2018-12-01 20:55:25.839995+0800 dispatch_group-Demo[47564:2176847] 6th thread sleep 0 seconds
2018-12-01 20:55:26.842480+0800 dispatch_group-Demo[47564:2176845] 1th thread sleep 1 seconds
2018-12-01 20:55:26.842484+0800 dispatch_group-Demo[47564:2176837] 5th thread sleep 1 seconds
2018-12-01 20:55:28.841831+0800 dispatch_group-Demo[47564:2176026] 3th thread sleep 3 seconds
2018-12-01 20:55:28.841859+0800 dispatch_group-Demo[47564:2176843] 2th thread sleep 3 seconds
2018-12-01 20:55:30.843902+0800 dispatch_group-Demo[47564:2176844] 0th thread sleep 5 seconds
2018-12-01 20:55:31.843272+0800 dispatch_group-Demo[47564:2176846] 4th thread sleep 6 seconds
2018-12-01 20:55:32.843084+0800 dispatch_group-Demo[47564:2176850] 9th thread sleep 7 seconds
2018-12-01 20:55:32.843088+0800 dispatch_group-Demo[47564:2176849] 8th thread sleep 7 seconds
2018-12-01 20:55:34.843344+0800 dispatch_group-Demo[47564:2176848] 7th thread sleep 9 seconds
2018-12-01 20:55:34.845123+0800 dispatch_group-Demo[47564:2168009] all finished

场景2:a,b,c,d,e五个网络请求(AFNetworking),c依赖于a,b的结果,d,e依赖于c的结果。

我们并不知道AFNetworking的queue是什么,dispatch_group_async(group, queue, block)很明显行不通。怎么办?
如下并没有使用dispatch_group_async(group, queue, block)。只是单纯的enterGroup,leaveGroup,groupNotify。
dispatch_group_enter(group) + dispatch_group_leave(group) + dispatch_group_notify(group,queue,block)

    dispatch_group_t group = dispatch_group_create();
    dispatch_group_enter(group);
    //假如这是一个异步的网络请求。
    dispatch_async(dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT), ^{
        NSLog(@"start task1");
        sleep(2);
        NSLog(@"end task1");
        dispatch_group_leave(group);
    });
    dispatch_group_enter(group);
    dispatch_async(dispatch_queue_create("queue2", DISPATCH_QUEUE_CONCURRENT), ^{
        NSLog(@"start task2");
        sleep(3);
        NSLog(@"end task2");
        dispatch_group_leave(group);
    });
    dispatch_group_enter(group);
    dispatch_async(dispatch_queue_create("queue3", DISPATCH_QUEUE_CONCURRENT), ^{
        NSLog(@"start task3");
        sleep(4);
        NSLog(@"end task3");
        dispatch_group_leave(group);
    });
    
    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_notify(group, queue, ^{
        dispatch_async(queue, ^{
            NSLog(@"start task4");
            sleep(3);
            NSLog(@"end task4");
        });
        dispatch_async(queue, ^{
            NSLog(@"start task5");
            sleep(3);
            NSLog(@"end task5");
        });
    });

输出结果

2018-12-01 20:46:18.790292+0800 dispatch_group-Demo[47366:2161890] start task1
2018-12-01 20:46:18.790357+0800 dispatch_group-Demo[47366:2161891] start task3
2018-12-01 20:46:18.790382+0800 dispatch_group-Demo[47366:2161889] start task2
2018-12-01 20:46:20.791751+0800 dispatch_group-Demo[47366:2161890] end task1
2018-12-01 20:46:21.792203+0800 dispatch_group-Demo[47366:2161889] end task2
2018-12-01 20:46:22.791940+0800 dispatch_group-Demo[47366:2161891] end task3
2018-12-01 20:46:22.793406+0800 dispatch_group-Demo[47366:2161891] start task5
2018-12-01 20:46:22.793427+0800 dispatch_group-Demo[47366:2161889] start task4
2018-12-01 20:46:25.799664+0800 dispatch_group-Demo[47366:2161891] end task5
2018-12-01 20:46:25.799664+0800 dispatch_group-Demo[47366:2161889] end task4

相关文章

  • GCD--group

    场景一:a,b,c,d,e五个耗时任务,c依赖于a,b的结果,d,e依赖于c的结果。 方式一 简单使用dispat...

网友评论

      本文标题:GCD--group

      本文链接:https://www.haomeiwen.com/subject/dngtcqtx.html