iOS dispatch_group 和 dispatch_barrier注意事项

1.第一种情况:dispatch_group_async直接执行具体任务,内部没有开启别的线程

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{

        for (int i=10; i>0; i--) {

            NSLog(@"%@ ++%d",[NSThread currentThread],i);

        }

    });

    dispatch_group_async(group, queue, ^{

        for (int i=10; i>0; i--) {

            NSLog(@"%@ ==%d",[NSThread currentThread],i);

        }

    });

    dispatch_group_notify(group, queue, ^{

        NSLog(@"group:over");

    });

会等所有任务执行完毕打印group:over

2021-05-13 17:04:34.606987+0800 test[20638:8113573] group:over

2.第二种情况:dispatch_group_async内嵌dispatch_async或者dispatch_sync操作,需要借助dispatch_group_enter和dispatch_group_enter,否则不会等到所有任务执行完毕就会打印group:over

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{

        dispatch_group_enter(group);

        dispatch_sync(queue, ^{

            for(inti=10; i>0; i--) {

                NSLog(@"%@ ++%d",[NSThread currentThread],i);

            }

            dispatch_group_leave(group);

        });

    });

    dispatch_group_async(group, queue, ^{

        dispatch_group_enter(group);

        dispatch_sync(queue, ^{

            for(inti=10; i>0; i--) {

                NSLog(@"%@ ==%d",[NSThread currentThread],i);

            }

            dispatch_group_leave(group);

        });

    });

    dispatch_group_notify(group, queue, ^{

        NSLog(@"group:over");

    });


会等所有任务执行完毕打印group:over

2021-05-13 16:56:55.015755+0800 test[19249:8100876] group:over


3.dispatch_barrier_async和dispatch_barrier_sync不能使用系统的全局并发队列,否则不起作用

区别:

dispatch_barrier_sync在主线程执行,执行完当前任务才能走后面的代码

dispatch_barrier_async在子线程执行,立刻返回,无需的等待当前任务执行完毕即可走后面的代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS面试总结 1. 网络 HTTP协议(HyperText Transfer Protocol)的请求和响应请求...
    崇山峻岭阅读 643评论 0 2
  • 1.单例的写法 (instancetype)sharedInstance {static id sharedIns...
    sunny_王阅读 438评论 0 0
  • /// 串行队列+异步 == 只会开启一个线程,且队列中所有的任务都是在这个线程中执行 NSLog(@"star...
    LoveToday2020阅读 208评论 0 0
  • 通过这篇文章,再熟悉一下多线程,这里主要是根据自己的理解,来介绍一下多线程 iOS有三种多线程编程的技术,分别是:...
    pengmengli阅读 297评论 0 0
  • iOS多线程编程 基本知识 1. 进程(process) 进程是指在系统中正在运行的一个应用程序,就是一段程序的执...
    陵无山阅读 6,146评论 1 14