美文网首页
GCD多线程同步-为什么多用dispatch_group_ent

GCD多线程同步-为什么多用dispatch_group_ent

作者: 爱吃萝卜的小蘑菇 | 来源:发表于2018-12-17 17:32 被阅读8次

GCD使用group进行多线程同步主要有三种方案:

  • dispatch_group_notify
  • dispatch_group_wait
  • dispatch_group_enter和dispatch_group_level

前两种方法属于同一类型使用也比较简单,但是为什么看开源项目的源码时经常看到dispatch_group_enter和dispatch_group_level搭配的使用呢?主要是因为如果在dispatch_group_async里执行的是异步代码,前两种方式会直接触发而不会等待异步任务完成。
像下边这种情况:

- (void)groupSync1
{
    dispatch_queue_t dispatchQueue = dispatch_queue_create("test.queue1", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    dispatch_group_t dispatchGroup = dispatch_group_create();
    dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
        
        dispatch_async(globalQueue, ^{
            
            sleep(5);
            NSLog(@"任务一完成");
        });
    });
    dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
        
        dispatch_async(globalQueue, ^{
            
            sleep(8);
            NSLog(@"任务二完成");
        });
    });
    dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
        NSLog(@"notify:任务都完成了");
    });
}
2018-12-17 17:24:27.899327+0800 Test[5022:529754] notify:任务都完成了
2018-12-17 17:24:32.893964+0800 Test[5022:529800] 任务一完成
2018-12-17 17:24:35.894750+0800 Test[5022:529805] 任务二完成

而使用dispatch_group_enter和dispatch_group_level就可以避免这种情况:

- (void)groupSync2
{
    dispatch_queue_t dispatchQueue = dispatch_queue_create("test.queue2", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    dispatch_group_t dispatchGroup = dispatch_group_create();
    
    dispatch_group_enter(dispatchGroup);
    dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
        dispatch_async(globalQueue, ^{
            sleep(5);
            NSLog(@"任务一完成");
            dispatch_group_leave(dispatchGroup);
        });
    });
    
    dispatch_group_enter(dispatchGroup);
    dispatch_group_async(dispatchGroup, dispatchQueue, ^(){
        dispatch_async(globalQueue, ^{
            sleep(8);
            NSLog(@"任务二完成");
            dispatch_group_leave(dispatchGroup);
        });
    });
    dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
        NSLog(@"notify:任务都完成了");
    });
}
2018-12-17 17:30:49.793777+0800 Test[5134:547774] 任务一完成
2018-12-17 17:30:52.797544+0800 Test[5134:547775] 任务二完成
2018-12-17 17:30:52.797843+0800 Test[5134:547707] notify:任务都完成了

相关文章

  • GCD多线程同步-为什么多用dispatch_group_ent

    GCD使用group进行多线程同步主要有三种方案: dispatch_group_notify dispatch_...

  • 多线程相关面试问题

    多线程:GCD、NSOperation、NSThread。 一、GCD 1、同步/异步 和 串行/并发(1)、同步...

  • iOS面试之多线程模块

    多线程 多线程内容如下: GCD NSOperation NSThread 多线程与锁 1.GCD 同步/异步和串...

  • [iOS面试]第6章 多线程相关面试问题

    本文主讲多线程相关面试问题:包括GCD、NSOperation、NSThread、多线程与锁。 一、GCD 同步/...

  • iOS面试 -- 多线程相关

    多线程技术方案 GCD NSOperation NSThread GCD 同步/异步 和串行/并发 dispatc...

  • 多线程

    GCD NSOperation NSThread 多线程与锁 一、GCD 同步、异步 和 串行、并发 dispat...

  • iOS gcd看我就够了

    gcd是iOS中多线程的一种技术,下面我们来看看gcd的用法 同步&异步 同步 同步执行:字面意思,同步执行就是执...

  • 多线程

    ios中为我们提供了GCD、NSOpration、NSThread 一、GCD多线程与锁GCD 同步异步、串行、并...

  • 多线程

    iOS中的几种多线程GCD1、GCD分为任务和队列,任务(同步,异步)队列(串行,并发),同步串行,同步主队列的情...

  • iOS开发多线程之GCD

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 GCD...

网友评论

      本文标题:GCD多线程同步-为什么多用dispatch_group_ent

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