美文网首页
dispatch group.h

dispatch group.h

作者: 想聽丿伱說衹愛我 | 来源:发表于2020-07-17 15:59 被阅读0次

版本:iOS13.5

group.h

dispatch其他文件通道

索引

  • dispatch_group_create
    创建可以与block关联的组
  • dispatch_group_async
    将block提交到调度队列queue并异步执行,并将block与给定的调度组group关联。
  • dispatch_group_async_f
    将函数work提交给调度队列queue并异步执行,并将work与给定的调度组group关联。
  • dispatch_group_wait
    同步等待,直到与group关联的所有block都已完成,或者直到超时为止。(会堵塞当前线程)
  • dispatch_group_notify
    与group关联的所有块均已完成后,将block提交给队列queue执行。
  • dispatch_group_notify_f
    与group关联的所有函数均已完成后,将work提交给队列queue执行。
  • dispatch_group_enter
    手动将group的计数加1
  • dispatch_group_leave
    手动将group的计数减1
    group的计数为0时才会告诉dispatch_group_waitdispatch_group_notifygroup中所有关联的block已完成

详解

  • 创建可以与block关联的组。
dispatch_group_t dispatch_group_create(void);
  • 将block提交到调度队列queue并异步执行,并将block与给定的调度组group关联。
void dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, 
                           dispatch_block_t block);
例:
    dispatch_queue_t queue = dispatch_queue_create("Dispatch_group", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        NSLog(@"block1");
        sleep(1);
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"block2");
        sleep(1);
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"block3");
        sleep(1);
    });
输出:因为queue是并行的 所以结果为132 也会出现123
block1
block3
block2
  • 将函数work提交给调度队列queue并异步执行,并将work与给定的调度组group关联。
void dispatch_group_async_f(dispatch_group_t group, dispatch_queue_t queue,
                            void *_Nullable context, dispatch_function_t work);

work 函数typedef void (*dispatch_function_t)(void *_Nullable)
context work传入的参数(传该参数的地址)
dispatch_group_async_f相较于dispatch_group_async就是将block变成work函数

例:
    dispatch_queue_t queue = dispatch_queue_create("Dispatch_group", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async_f(group, queue, nil, test);

void test(void *context) {
    NSLog(@"test");
}
输出:
test
  • 同步等待,直到与group关联的所有block都已完成,或者直到超时为止。(会堵塞当前线程)
long dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout);

timeout DISPATCH_TIME_FOREVER表示永不超时 DISPATCH_TIME_NOW表示立即超时 或dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC)指定时间
long 与该组block关联的所有block在超时时间内完成则返回0,超时则返回非0

例:
    dispatch_queue_t queue = dispatch_queue_create("Dispatch_group", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        sleep(1);
        NSLog(@"block1");
    });
    dispatch_group_async(group, queue, ^{
        sleep(1);
        NSLog(@"block2");
    });
    dispatch_group_async(group, queue, ^{
        sleep(1);
        NSLog(@"block3");
    });
    
    dispatch_async(queue, ^{
        long count = dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC));
        NSLog(@"count = %ld", count);
    });
输出:因为sleep(1),block只执行了1秒,超时时间为2秒,所以count = 0表示未超时
block1
block3
block2
count = 0
若block2 sleep(3),则输出
block1
block3
count = 49
block2
超时时间2秒内block2未执行完,所有会超时 count = 49
  • 与group关联的所有块均已完成后,将block提交给队列queue执行。
void dispatch_group_notify(dispatch_group_t group, dispatch_queue_t queue,
    dispatch_block_t block);

当group中没有关联的块时 会直接执行block

例:
    dispatch_queue_t queue = dispatch_queue_create("Dispatch_group", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        sleep(1);
        NSLog(@"block1");
    });
    dispatch_group_async(group, queue, ^{
        sleep(3);
        NSLog(@"block2");
    });
    dispatch_group_async(group, queue, ^{
        sleep(1);
        NSLog(@"block3");
    });
  
    dispatch_group_notify(group, queue, ^{
        NSLog(@"所有block都完成");
    });
输出:
block1
block3
block2
所有block都完成
  • 与group关联的所有函数均已完成后,将work提交给队列queue执行。
void dispatch_group_notify_f(dispatch_group_t group, dispatch_queue_t queue,
    void *_Nullable context, dispatch_function_t work);

相关释义可查看dispatch_group_async_f
dispatch_group_notify_f相较于dispatch_group_notify就是将block变成了函数work

  • 手动将group的计数加1
void dispatch_group_enter(dispatch_group_t group)
  • 手动将group的计数减1
void dispatch_group_leave(dispatch_group_t group);

注意:dispatch_group_enterdispatch_group_leave必须成对出现
dispatch_group_async就是先让group的计数加1,待block执行完成后group的计数减1

dispatch_group_async(group, queue, ^{

});
相当于
dispatch_group_enter(group);
dispatch_async(queue, ^{
    dispatch_group_leave(group);
});

group的计数为0时才会告诉dispatch_group_waitdispatch_group_notify组group中所有关联的block已完成

例:
    dispatch_queue_t queue = dispatch_queue_create("Dispatch_group", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        sleep(1);
        NSLog(@"block1");
    });
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
       sleep(3);
       NSLog(@"block4");
       dispatch_group_leave(group);
    });
    
    dispatch_group_notify(group, queue, ^{
        NSLog(@"所有block都完成");
    });
输出:
block1
block4
所有block都完成

相关文章

网友评论

      本文标题:dispatch group.h

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