关于dispatch_group的概念以及几种场景下的使用:
1、调用接口的时候,一个vc下要调用多个接口的情况下,而且这写接口成功回调顺序需要严格控制。目前的解决方式通常是在第一个接口成功的回调里边调起第二个接口,这种方式不能说不行,但是某些时候可能也会存在无法控制不能实现业务逻辑。但是通过dispatch_group就可以很好的控制并实现这一目的。
2、现在有4个任务,任务1、任务2、任务3、任务4. 任务3必须在任务2之后,任务4必须在前3个任务都执行完成后,才能执行,并且需要在主线程更新UI。 任务3必须在任务2之后,所以这两个必须串行执行,同时,任务2和3整体可以和任务1并行执行,最后,任务4只能等待前3个任务全部执行完成,才能执行。这里就可以用group快速实现场景需求
关于dispatch_group
把一组任务提交到队列中,这些队列可以不相关,然后监听这组任务完成的事件。
最常见的几个方法:
1、dispatch_group_create创建一个调度任务组
2、dispatch_group_async 把一个任务异步提交到任务组里
3、dispatch_group_enter/dispatch_group_leave 这种方式用在不使用dispatch_group_async来提交任务,且必须配合使用
4、dispatch_group_notify 用来监听任务组事件的执行完毕
5、dispatch_group_wait 设置等待时间,在等待时间结束后,如果还没有执行完任务组,则返回。返回0代表执行成功,非0则执行失败
针对场景2可以使用下边的方式实现:
任务3必须在任务2之后,所以这两个必须串行执行,同时,任务2和3整体可以和任务1并行执行,最后,任务4只能等待前3个任务全部执行完成,才能执行。
-(void)disGroup{
dispatch_queue_t globalQuene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 全局并发队列
dispatch_queue_t selfQuene = dispatch_queue_create("myQuene", 0); // 串行队列
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, globalQuene, ^{
NSLog(@"run task 1");
});
dispatch_group_async(group, selfQuene, ^{
NSLog(@"run task 2");
});
dispatch_group_async(group, selfQuene, ^{
NSLog(@"run task 3");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"run task 4");
});
总结: 1和(2、3)是并行执行关系,2、3是串行执行关系,且3肯定在2之后,而4在(1、2、3)全部完成之后才会执行。
假如:有3个异步请求任务,任务1、2、3,在3个任务全部完成之后,需要执行任务4,用以显示界面数据。
实现方式:
-(void)disGroupEnterAndLeave{
dispatch_queue_t globalQuene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
//任务1
dispatch_group_enter(group);
dispatch_async(globalQuene, ^{
NSLog(@"run task 1");
sleep(1);
dispatch_group_leave(group);
});
//任务2
dispatch_group_enter(group);
dispatch_async(globalQuene, ^{
NSLog(@"run task 2");
sleep(2);
dispatch_group_leave(group);
});
//任务3
dispatch_group_enter(group);
dispatch_async(globalQuene, ^{
NSLog(@"run task 3");
sleep(3);
dispatch_group_leave(group);
});
//一直等待完成
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
//任务3
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"run task 4");
});
}
执行结果:
3个任务是并行执行,且一共花费3s执行,然后才执行任务4。
当然,如果这样想串行执行3个任务,只需要把 全局队列 换成 自定义队列 即可。