dispatch group.h

2020-07-17  本文已影响0人  想聽丿伱說衹愛我

版本:iOS13.5

group.h

dispatch其他文件通道

索引

详解

dispatch_group_t dispatch_group_create(void);
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
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
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
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都完成
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

void dispatch_group_enter(dispatch_group_t group)
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都完成
上一篇 下一篇

猜你喜欢

热点阅读