dispatch_group_enter用法和讲解

这个方法主要和下面几个方法一起使用的:

  • dispatch_group_enter
  • dispatch_group_leave
  • dispatch_group_notify
  • dispatch_group_wait

dispatch_group_enterdispatch_group_leave 一般是成对出现的, 进入一次,就得离开一次。也就是说,当离开和进入的次数相同时,就代表任务组完成了。如果enterleave多,那就是没完成,如果leave调用的次数多了, 会崩溃的;

看如下代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        [self test];
    });
}
- (void)test
{
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_enter(group);
    dispatch_group_enter(group);
    NSLog(@"加入");
    NSLog(@"加入");
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    // 异步2秒后离开
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), queue, ^{
        NSLog(@"即将离开 - 1");
        dispatch_group_leave(group);
        NSLog(@"已经离开 - 1");
    });
    
    // 异步3秒后离开
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), queue, ^{
        NSLog(@"即将离开 - 2");
        dispatch_group_leave(group);
        NSLog(@"已经离开 - 2");
    });
    dispatch_group_notify(group, queue, ^{
        NSLog(@"都完成了");
    });
    NSLog(@"开始等待");
    dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)));
    NSLog(@"等待结束");
}

打印的结果是:

2018-03-19 11:55:59.077862+0800 Test[26326:1160676] 加入
2018-03-19 11:55:59.078010+0800 Test[26326:1160676] 加入
2018-03-19 11:55:59.078649+0800 Test[26326:1160676] 开始等待
2018-03-19 11:56:01.187318+0800 Test[26326:1160674] 即将离开 - 1
2018-03-19 11:56:01.187573+0800 Test[26326:1160674] 已经离开 - 1
2018-03-19 11:56:02.377367+0800 Test[26326:1160674] 即将离开 - 2
2018-03-19 11:56:02.377703+0800 Test[26326:1160674] 已经离开 - 2
2018-03-19 11:56:02.377732+0800 Test[26326:1160676] 等待结束
2018-03-19 11:56:02.377755+0800 Test[26326:1160681] 都完成了

dispatch_group_wait :在任务组完成时调用,或者任务组超时是调用(完成指的是enterleave次数一样多)
dispatch_group_notify:不管超不超时,只要任务组完成,会调用,不完成不会调用

上面代码,enter了两次,wait是会阻塞当前线程的,wait时间为6秒, 在6秒内leave了两次, 当最后一次leave的时候,wait就会执行(打开阻塞), 继续往下执行;NSLog(@"已经离开 - 2");NSLog(@"等待结束");是异步进行的;谁先谁后不一定;
最后一次的dispatch_group_leave(group);执行完之后,dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)));这条代码的阻塞就立即打开了,然后往下执行

小伙伴可以自行修改延时leave时间,比如第二个延时改成8秒,试一试都会打印什么

如果觉得有帮助, 点个star吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《孟子》海说102:为往圣继绝学 尽心篇:去圣人之世若此其未远也,近圣人之居若此其甚也,然而无有乎尔,则亦无有乎尔...
    弘海先生阅读 1,180评论 0 1
  • 做人做到极致就是一张票子。做人的最高境界就是成为硬通货,不管是在熟悉的人当中,还是在陌生的人当中,大家都认识你。 ...
    Lo俊彦阅读 626评论 0 0
  • 致最爱的你~葛苏 我比较喜欢用文字记录生活,用文字表达心情,即使是发发牢骚也好,矫情一下也好,但是我觉得有些...
    高赛歌阅读 464评论 0 0