Dispatch_group_t日常使用注意事项

参考博客:https://www.cnblogs.com/zhou--fei/p/6747938.html

一、dispatch_group_t相关属性介绍

1.dispatch_group_async(group, queue, block);将block任务添加到queue队列,并被group组管理

2.dispatch_group_enter(group);

声明dispatch_group_enter(group)下面的任务由group组管理,group组的任务数+1

3.dispatch_group_leave(group);

相应的任务执行完成,group组的任务数-1

4.dispatch_group_create();

创建一个group组

5.dispatch_group_wait(group1,DISPATCH_TIME_FOREVER);

当前线程暂停,等待dispatch_group_wait(group1, DISPATCH_TIME_FOREVER)上面的

任务执行完成后,线程才继续执行。

6.dispatch_group_notify(group1,queue1,block);

监听group组中任务的完成状态,当所有的任务都执行完成后,触发block块,执行总结性处

理。

二、常见用法的区别

1、dispatch_group_async(group, queue, block)和dispatch_group_notify(group1,

queue1,block)组合

这种组合下在执行同步任务时正常,但是不能保证queue中人物的执行顺序

在执行异步任务时不正常,会出现先执行dispatch_group_notify的情况

同步任务:

dispatch_queue_t queue1 =

dispatch_queue_create("dispatchGroupMethod1.queue1",

DISPATCH_QUEUE_CONCURRENT);

dispatch_group_t group1 =dispatch_group_create();

dispatch_group_async(group1, queue1, ^{

dispatch_sync(queue1, ^{

for(NSInteger i =0; i<3; i++) {

sleep(1);

NSLog(@"%@-同步任务执行-:%ld",@"任务1",(long)i);

}

});

});

dispatch_group_async(group1, queue1, ^{

dispatch_sync(queue1, ^{

for(NSInteger i =0; i<3; i++) {

sleep(1);

NSLog(@"%@-同步任务执行-:%ld",@"任务2",(long)i);

}

});

});

//等待上面的任务全部完成后,会收到通知执行block中的代码(不会阻塞线程)

dispatch_group_notify(group1, queue1,^{

NSLog(@"Method1-全部任务执行完成");

});

2、dispatch_group_enter(group)和dispatch_group_leave(group)和

dispatch_group_notify(group1, queue1,block)组合

该组合下执行同步任务正常,可以使得queue中的任务block按照添加顺序依次执行

执行异步任务正常,但是不能保证queue中人物的执行顺序

同步任务代码

dispatch_queue_t queue2 =

dispatch_queue_create("dispatchGroupMethod2.queue2",

DISPATCH_QUEUE_CONCURRENT);

dispatch_group_t group2 = dispatch_group_create();

dispatch_group_enter(group2);

dispatch_sync(queue2, ^{

for(NSInteger i =0; i<3; i++) {

sleep(1);

NSLog(@"%@-同步任务执行-:%ld",@"任务1",(long)i);

}

dispatch_group_leave(group2);

});

dispatch_group_enter(group2);

dispatch_sync(queue2, ^{

for(NSInteger i =0; i<3; i++) {

sleep(1);

NSLog(@"%@-同步任务执行-:%ld",@"任务2",(long)i);

}

dispatch_group_leave(group2);

});

//等待上面的任务全部完成后,会收到通知执行block中的代码(不会阻塞线程)

dispatch_group_notify(group2, queue2, ^{

NSLog(@"Method2-全部任务执行完成");

});

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • NSThread 第一种:通过NSThread的对象方法 NSThread *thread = [[NSThrea...
    攻城狮GG阅读 4,296评论 0 3
  • 背景 担心了两周的我终于轮到去医院做胃镜检查了!去的时候我都想好了最坏的可能(胃癌),之前在网上查的症状都很相似。...
    Dely阅读 13,034评论 21 42
  • Managing Units of Work(管理工作单位) 调度块允许您直接配置队列中各个工作单元的属性。它们还...
    edison0428阅读 12,476评论 0 1
  • 3.GCD GCD的全称是Grand Central Dispatch,提供了非常多的纯C语言的函数 GCD的优势...
    Mario_ZJ阅读 3,424评论 0 0
  • 和人类围棋高手大战多日的Master终于显露了真身,原来它就是去年名声大噪的阿法狗,其实在这之前,就已经有多人预测...
    更好时代阅读 3,465评论 0 0