美文网首页
第三章 3.2.6 Dispatch Group

第三章 3.2.6 Dispatch Group

作者: MrSYLong | 来源:发表于2018-07-25 21:53 被阅读21次

    问题一、在追加到Dispatch Queue中的多个处理全部结束后想执行结束处理?
    1、使用一个Serial Dispatch Queue时,只要将结束处理最后追加即可。
    2、使用Concurrent Dispatch Queue时,使用Dispatch Group。

    // 例子:追加3个Block到Global Dispatch Queue,这些处理全部执行完毕,会执行追加到Main Dispatch Queue中的结束处理Block
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"0");
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"1");
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"2");
    });
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"done");
    });
    
    dispatch_release(group);
    
    说明:
    dispatch_group_create函数生成dispatch_group_t类型的Dispatch Group,函数中含有create,所以在使用结束后需要通过dispatch_release函数释放。
    
    dispatch_group_async函数,第一个参数为生成的Dispatch Group,第二个参数为Dispatch Queue,第三个参数是Block,将Block追加到Dispatch Queue中,Block属于指定的Dispatch Group。
    
    Block通过dispatch_retain函数持有Dispatch Group,Block执行结束,通过dispatch_release函数释放持有的Dispatch Group。Dispatch Group使用结束,不用考虑Block,立即通过dispatch_release函数释放即可。
    
    dispatch_group_notify函数第一个参数为要监视的Dispatch Group,第二个参数为要追加结束处理的Dispatch Queue,第三个结束处理Block。
    

    问题二、dispatch_group_wait函数,等待全部处理执行结束?

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"0");
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"1");
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"2");
    });
    
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    说明:
    dispatch_group_wait函数第一个参数为等待的Dispatch Group,第二个参数为等待的时间(超时),为dispatch_time_t类型。
    DISPATCH_TIME_FOREVER:永久等待。
    

    问题三、dispatch_group_wait函数,指定等待时间间隔?

    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 1ull * NSEC_PER_SEC);
    
    long result = dispatch_group_wait(group, time);
    
    if (result == 0) {
        // 全部处理执行结束
    } else {
        // 某一个处理还在执行中
    }
    
    说明:
    dispatch_group_wait函数返回值为0:全部处理执行结束
    dispatch_group_wait函数返回值不为0:某一个处理还在执行中
    等待时间为DISPATCH_TIME_FOREVER,返回值恒为0。
    注意:一旦调用dispatch_group_wait函数,该函数就处于调用状态而不返回。执行该函数的当前线程停止,在经过该函数中指定的时间或该函数的所有处理全部执行结束之前,执行该函数的线程停止。
    
    //  指定DISPATCH_TIME_NOW,则不用任何等待即可判断属于Dispatch Group的处理是否全部执行结束
    long result = dispatch_group_wait(group, DISPATCH_TIME_NOW);
    

    相关文章

      网友评论

          本文标题:第三章 3.2.6 Dispatch Group

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