美文网首页
GCD之调度组diapatch_group

GCD之调度组diapatch_group

作者: ElaineYin | 来源:发表于2018-05-23 16:57 被阅读26次

调度函数:dispatch_group

dispatch_group是GCD(Grand Central Dispatch)中的一组方法,他有一个组的概念,可以把相关的任务归并到一个组内来执行,通过监听组内所有任务的执行情况来做相应处理。

dispatch_group调度组:分别异步执行2个耗时任务,然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到GCD的dispatch_group。
来看下dispatch_group中的几个重要函数

  • dispatch_group_creat:创建函数
  • dispatch_group_async
    把异步任务提交到指定任务组和指定下拿出队列执行
/*!@function dispatch_group_async 函数说明
 * @abstract
 * 把block任务块添加到队列中,并关联到给定的调度组
 * @param group 关联的调度组
 * @param queue block任务提交的队列
 * @param block 任务块
 */
dispatch_group_async(dispatch_group_t group,
    dispatch_queue_t queue,
    dispatch_block_t block);
  • dispatch_group_enter & dispatch_group_leave
    调用这个方法标志着一个代码块被加入了group,和dispatch_group_async功能类似;dispatch_group_enter()、dispatch_group_leave()必须成对出现。
dispatch_queue_t queue2 = dispatch_queue_create("group.elaine.yin", DISPATCH_QUEUE_SERIAL);
    dispatch_group_enter(group);
    dispatch_async(queue2, ^{
        //加入到queue队列执行的block块
        NSLog(@"test2");
        dispatch_group_leave(group);
    });
  • dispatch_group_notify
    待调度组执行完毕时调用,不会阻塞当前线程,比如当任务全部执行完成之后,在主线程更新UI,这样使用
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        //更新UI
    });
  • dispatch_wait
    dispatch_group_notify功能类似(多了一个dispatch_time_t参数可以设置超时时间),在group上任务完成前,dispatch_group_wait会阻塞当前线程(所以不能放在主线程调用)一直等待;
    当group上任务完成,或者等待时间超过设置的超时时间会结束等待;执行完成返回0,未执行完毕返回非0。
dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSInteger result = dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC));
        if (result == 0) {
            NSLog(@"加入到group的任务能在5秒之内执行完毕");
        } else {
            NSLog(@"加入到group的任务不能在5秒之内执行完毕");
        }
    });

注意dispatch_group_wait是同步的所以不能放在主线程执行。

Code Test

- (void)groupTest {
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_async(group, queue1, ^{
        [NSThread sleepForTimeInterval:5];
        //加入到queue队列执行的block块
        NSLog(@"test1");
    });
    
    dispatch_queue_t queue2 = dispatch_queue_create("group.elaine.yin", DISPATCH_QUEUE_SERIAL);
    //调用这个方法标志着一个代码块被加入了group,和dispatch_group_async功能类似;dispatch_group_enter()、dispatch_group_leave()必须成对出现
    dispatch_group_enter(group);
    dispatch_async(queue2, ^{
        //加入到queue队列执行的block块
        NSLog(@"test2");
        dispatch_group_leave(group);
    });
    
    //dispatch_group_notify
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"所有任务全部执行完毕,更新UI");
    });
    /*
     dispatch_group_wait函数说明
     和dispatch_group_notify功能类似(多了一个dispatch_time_t参数可以设置超时时间),在group上任务完成前,dispatch_group_wait会阻塞当前线程(所以不能放在主线程调用)一直等待;当group上任务完成,或者等待时间超过设置的超时时间会结束等待;执行完成返回0,未执行完毕返回非0
    dispatch_group_wait是同步的所以不能放在主线程执行。
     */
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSInteger result = dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC));
        if (result == 0) {
            NSLog(@"加入到group的任务能在5秒之内执行完毕");
        } else {
            NSLog(@"加入到group的任务不能在5秒之内执行完毕");
        }
    });
}
GCD系列

相关文章

  • GCD之调度组diapatch_group

    调度函数:dispatch_group dispatch_group是GCD(Grand Central Disp...

  • iOS多线程之GCD - 基础

    GCD系列 GCD基础 GCD进阶函数 调度组dispatch_group 信号量dispatch_semapho...

  • GCD调度组的使用

    GCD调度组(dispatch_group)的使用 GCD是Grand Central Dispatch的缩写,它...

  • GCD调度组

    1、第一种方式 2、第二种方式

  • GCD调度组

    使用场景 在实际开发中,需要开启N个异步线程,(如异步下载N张图片,下载结束后需要继续执行某项任务),需要依赖N个...

  • GCD-调度组

    如果有多个执行任务,我们希望他们都执行完成后执行某一操作,可以采用调度组。 1、创建调度组: 2、创建并发任务: ...

  • iOS 前面任务下载完成,执行后续操作。

    1.思路:GCD调度组:dispatch_group 或者 效果一样 2.概念

  • iOS GCD 之 底层原理分析

    本文是队列创建、同步/异步函数、单例、信号量以及调度组的底层原理分析 队列创建 在上一篇文章GCD 之 函数与队列...

  • GCD调度组的使用

    生词表 使用场景 在实际开发中,需要开启N个异步线程,但是后续操作,需要依赖N个线程返回的数据,需要接收所有线程任...

  • GCD 多线程的使用及分析(swift)

    GCD全称Grand Central Dispatch,从名称可以看出GCD就是起到中央调度的作用。这个调度作用就...

网友评论

      本文标题:GCD之调度组diapatch_group

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