GCD学习之group

GCD的group方法只有async(异步方法)即

void dispatch_group_async(dispatch_group_t group,
    dispatch_queue_t queue,
    dispatch_block_t block);

使用group要传2个参数 group、queue,其中group使用

//创建group
dispatch_group_t group = dispatch_group_create();

queue我们可以使用以下几种方式

dispatch_queue_t queue = dispatch_get_main_queue()
//或者 
queue = dispatch_get_global_queue(0, 0);
//或者 并行队列
queue = dispatch_queue_create("com.sccc", DISPATCH_QUEUE_CONCURRENT);
//或者串行队列
queue = dispatch_queue_create("com.sccc", DISPATCH_QUEUE_SERIAL);

这里主要区分串行和并行的方式

- (void)doSomething:(void (^)())handler {
    if (handler) {
        sleep(2);
        handler();
    }
}
//异步串行group
- (void)groupAsyncSerialTest {
    //创建串行队列
    dispatch_queue_t queue = dispatch_queue_create("com.sccc", DISPATCH_QUEUE_SERIAL);
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, queue, ^{
        [self doSomething:^() {
            NSLog(@"任务一");
        }];
    });
    dispatch_group_async(group, queue, ^{
        [self doSomething:^() {
            NSLog(@"任务二");
        }];
    });
    dispatch_group_async(group, queue, ^{
        [self doSomething:^() {
            NSLog(@"任务三");
        }];
    });
    dispatch_group_notify(group, queue, ^{
        NSLog(@"前面的任务已完成");
    });
}

结果


串行队列打印结果

值得注意的是按照顺序每2s打印一次

串行队列的情况如下:

//异步并行
- (void)groupAsyncConcurrentTest {
    //创建并行队列
    dispatch_queue_t queue = dispatch_queue_create("com.sccc", DISPATCH_QUEUE_CONCURRENT);
    queue = dispatch_get_global_queue(0, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        [self doSomething:^() {
            NSLog(@"任务一");
        }];
    });
    dispatch_group_async(group, queue, ^{
        [self doSomething:^() {
            NSLog(@"任务二");
        }];
    });
    dispatch_group_async(group, queue, ^{
        [self doSomething:^() {
            NSLog(@"任务三");
        }];
    });
    dispatch_group_notify(group, queue, ^{
        NSLog(@"前面的任务已完成");
    });
}

结果如下

并行打印结果

多次试验总结的结果是任务完成先后顺序不定,前面的任务都完成后才会执行notify中的任务


当然以上的情况不适用于网络请求
网络请求使用group时需要注意

dispatch_group_enter(group);
dispatch_group_leave(group);

搭配使用
下面是没有搭配使用的情况

//异步并行
- (void)groupAsyncConcurrentTest {
    //创建并行队列
    dispatch_queue_t queue = dispatch_queue_create("com.sccc", DISPATCH_QUEUE_CONCURRENT);
    queue = dispatch_get_global_queue(0, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        [[CMAppRequest sharedInstance] guideMessage:^() {
           NSLog(@"任务一");
        }];
    });
    dispatch_group_async(group, queue, ^{
        [[CMAppRequest sharedInstance] guideMessage:^() {
            NSLog(@"任务二");
        }];
    });
    dispatch_group_async(group, queue, ^{
        [[CMAppRequest sharedInstance] guideMessage:^() {
            NSLog(@"任务三");
        }];
    });
    dispatch_group_notify(group, queue, ^{
        NSLog(@"前面的任务已完成");
    });
}

结果如下


网络请求打印结果

你会发现notify不起作用了,这时候就要用到enter、leave了
修改代码如下:

//异步并行
- (void)groupAsyncConcurrentTest {
    //创建并行队列
    dispatch_queue_t queue = dispatch_queue_create("com.sccc", DISPATCH_QUEUE_CONCURRENT);
    queue = dispatch_get_global_queue(0, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_enter(group);
    [[CMAppRequest sharedInstance] guideMessage:^() {
           dispatch_group_leave(group);
           NSLog(@"任务一");
    }];
    dispatch_group_enter(group);
    [[CMAppRequest sharedInstance] guideMessage:^() {
            dispatch_group_leave(group);
            NSLog(@"任务二");
    }];
    dispatch_group_enter(group);
    [[CMAppRequest sharedInstance] guideMessage:^() {
            dispatch_group_leave(group);
            NSLog(@"任务三");
    }];
    dispatch_group_notify(group, queue, ^{
        NSLog(@"前面的任务已完成");
    });
}

//考虑到请求是异步队列,不在需要使用dispatch_group_async

结果如下:


这就正常了,网络请求的就不在做串行和并行的测试了,以上网络请求部分使用的是串行队列,串行的打印结果只和网络请求的返回顺序有关。

  • 最后特别需要注意,enter和leave一定要成对出现;否则如实enter多了,notify里的任务就会永远执行不了,若是levae多了则会照成crash

当然这只是group的一部分还有dispatch_group_wait等功能没有一一实现,以上内容只代表个人观点,如有问题欢迎指正,谢谢~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,227评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,755评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,899评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,257评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,617评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,757评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,982评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,715评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,454评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,666评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,148评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,512评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,156评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,112评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,896评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,809评论 2 279
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,691评论 2 272

推荐阅读更多精彩内容

  • 1 GCD 术语 1.1 Serial vs. Concurrent 串行 vs. 并发 概念:该术语描述执行当前...
    NinthDay阅读 3,815评论 2 38
  • 2017-07-28iOS开发 导语:在iOS中,多线程方案有四种:pthread、NSThread、NSOper...
    C9090阅读 393评论 0 1
  • 在这两部分的系列中,第一个部分的将解释 GCD 是做什么的,并从许多基本的 GCD 函数中找出几个来展示。在第二部...
    透支未来阅读 319评论 0 1
  • 学习多线程,转载两篇大神的帖子,留着以后回顾!第一篇:关于iOS多线程,你看我就够了 第二篇:GCD使用经验与技巧...
    John_LS阅读 580评论 0 3
  • 四圣谛:苦集灭道 五蕴 色蕴:包括自身的眼、耳、鼻、舌、身等五根,以及反映自身而起感受作用的色、声、香、味、触的五...
    monchhichi1005阅读 325评论 0 0