美文网首页
dispatch_group_t详解

dispatch_group_t详解

作者: 野码道人 | 来源:发表于2021-08-23 10:43 被阅读0次

概览

定义在group.h中,api较少,只有创建、提交、阻塞、通知组

  • 创建组
dispatch_group_t
dispatch_group_create(void);
  • 在组中异步提交block到队列
void
dispatch_group_async(dispatch_group_t group,
    dispatch_queue_t queue,
    dispatch_block_t block);
  • 在组中异步提交c函数指针到队列
void
dispatch_group_async_f(dispatch_group_t group,
    dispatch_queue_t queue,
    void *_Nullable context,
    dispatch_function_t work);

  • 阻塞当前线程直到一组任务执行完毕或者超时
intptr_t
dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout);
  • 一组任务执行完毕通知回到block
void
dispatch_group_notify(dispatch_group_t group,
    dispatch_queue_t queue,
    dispatch_block_t block);
  • 一组任务执行完毕通知回到c函数指针
void
dispatch_group_notify_f(dispatch_group_t group,
    dispatch_queue_t queue,
    void *_Nullable context,
    dispatch_function_t work);
  • 进入组相当于dispatch_group_async,信号量+1
void
dispatch_group_enter(dispatch_group_t group);

离开组相当于group中的一个任务执行完毕,信号量-1

void
dispatch_group_leave(dispatch_group_t group);

注意:

group是基于信号量实现的,所以一组任务在任意队列执行,结果都是一样的

使用

NSLog(@"begin:%@",[NSThread currentThread]);
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_enter(group);
dispatch_async(queue, ^{
    NSLog(@"1:%@",[NSThread currentThread]);
    dispatch_group_leave(group);
});

dispatch_group_enter(group);
dispatch_async(queue, ^{
    NSLog(@"2:%@",[NSThread currentThread]);
    dispatch_group_leave(group);
});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    NSLog(@"end:%@",[NSThread currentThread]);
});
NSLog(@"任务提交完毕");

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"等待任务全部完成后再往下执行");
NSLog(@"begin:%@",[NSThread currentThread]);
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_async(group, queue, ^{
    NSLog(@"1:%@",[NSThread currentThread]);
});

dispatch_group_async(group, queue, ^{
    NSLog(@"2:%@",[NSThread currentThread]);
});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    NSLog(@"end:%@",[NSThread currentThread]);
});
NSLog(@"任务提交完毕");

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"等待任务全部完成后再往下执行");

上面这两种写法等效,输出结果如下:

2021-08-23 10:46:43.862446+0800 GCDDemo[4404:2489050] begin:<NSThread: 0x2838a08c0>{number = 1, name = main}
2021-08-23 10:46:43.862566+0800 GCDDemo[4404:2489050] 任务提交完毕
2021-08-23 10:46:43.862663+0800 GCDDemo[4404:2489062] 1:<NSThread: 0x2838e4ac0>{number = 6, name = (null)}
2021-08-23 10:46:43.862694+0800 GCDDemo[4404:2489064] 2:<NSThread: 0x2838e1100>{number = 7, name = (null)}
2021-08-23 10:46:43.862760+0800 GCDDemo[4404:2489050] 等待任务全部完成后再往下执行
2021-08-23 10:46:43.872680+0800 GCDDemo[4404:2489050] end:<NSThread: 0x2838a08c0>{number = 1, name = main}

总结

底层基于信号量实现,用于实现有依赖关系的并发操作
dispatch_group是一个初始值为LONG_MAX的信号量,根据信号量值是否恢复成初始值判断执行dispatch_group_notify,dispatch_group_enter执行信号量-1,dispatch_group_leave执行信号量+1, dispatch_group_wait会阻塞当前线程直到一组任务执行完毕或者超时

相关文章

网友评论

      本文标题:dispatch_group_t详解

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