美文网首页
iOS多线程-GCD之Dispatch Group

iOS多线程-GCD之Dispatch Group

作者: Autolying | 来源:发表于2017-03-04 16:12 被阅读0次

    上一篇 iOS多线程-GCD之dispatch_set_target_queue

    一、释义

    //创建一个group
    dispatch_group_t dispatch_group_create(void);
    
    //将操作加入到group当中
    void dispatch_group_async(dispatch_group_t group,
        dispatch_queue_t queue,
        dispatch_block_t block);
    
    //通知某个执行队列,group中的异步操作全部执行完毕,可以追加其它操作
    void dispatch_group_notify(dispatch_group_t group,
        dispatch_queue_t queue,
        dispatch_block_t block);
    

    dispatch_group_create()会返回一个dispatch_group_t,只需要一个该类型的变量进行接收,即可使用了。
    dispatch_group_async()会将操作放入group中,它有三个参数:

    group----创建的group,这个group容纳一些异步操作
    queue----追加操作执行的队列
    block----追加的操作(即代码块)
    注意:它没有对应的 dispatch_group_sync()

    dispatch_group_notify()会在group中操作执行完毕后进行一个通知,它有三个参数:

    group----进行监控的group
    queue----group中操作执行完毕后的执行队列
    block----group中操作执行完毕后再执行的操作

    二、示例

    //获取一个全局队列
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    //创建一个group
    dispatch_group_t group = dispatch_group_create();
    
    //在group执行操作
    dispatch_group_async(group, globalQueue, ^{ NSLog(@"1"); });
    dispatch_group_async(group, globalQueue, ^{ NSLog(@"2"); });
    dispatch_group_async(group, globalQueue, ^{ NSLog(@"3"); });
    dispatch_group_async(group, globalQueue, ^{ NSLog(@"4"); });
    dispatch_group_async(group, globalQueue, ^{ NSLog(@"5"); });
    
    //group中的操作全部执行完,通知队列
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"Done!");
    });
    

    执行结果:

    2017-03-04 16:28:12.412 GCDLearn[918:46111] 1
    2017-03-04 16:28:12.412 GCDLearn[918:46120] 5
    2017-03-04 16:28:12.412 GCDLearn[918:46119] 4
    2017-03-04 16:28:12.412 GCDLearn[918:46110] 2
    2017-03-04 16:28:12.412 GCDLearn[918:46115] 3
    2017-03-04 16:28:12.416 GCDLearn[918:45968] Done!
    

    分析:在group作用下,前面数字输出顺序无论怎么变,Done都会在最后输出。

    三、dispatch_group_wait

    //定义
    long dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout);
    

    第一个参数是一个group,第二个参数是一个dispatch_time类型的值,常用的有DISPATCH_TIME_FOREVER、DISPATCH_TIME_NOW。它会返回一个long类型的值,0代表执行完毕,1代表未执行完毕。

    让我们将上面代码中 dispatch_group_notify()部分代码替换成 dispatch_group_wait()

    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    dispatch_group_wait(group, DISPATCH_TIME_NOW);
    

    当参数是 DISPATCH_TIME_FOREVER 时,程序会一直等待group中操作执行完毕,所以它的返回值恒为0;
    当参数是 DISPATCH_TIME_NOW 时,程序不会进行任何等待就会去判断group中的操作是否执行完毕。

    推荐使用 dispatch_group_notify()

    GCD学习代码 如果觉得有用,顺便给颗星哦😄
    下一篇:iOS多线程-GCD之dispatch_barrier_async

    相关文章

      网友评论

          本文标题:iOS多线程-GCD之Dispatch Group

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