在实际开发中,我们经常会遇到这样的问题:有几个不同的任务,当所有任务完成后需要根据这些任务的结果去执行下一步操作(例如:下载多张图片,全部下载后进行拼接并显示出来)。我们利用上边刚刚讲过的 dispatch_barrier 方法或许可以达到此类目的,但下边要讲的 dispatch_group 相关方法才更适合解决类似问题。
在编写测试代码之前,我们还要了解一下 dispatch_group_notify
。
dispatch_group_notify
dispatch_group_notify
可以监听 group 中所有任务的完成状态,当所有任务都执行完成后,会追加任务到 group 中,并执行该任务。下面我们通过具体示例来详细了解 dispatch_group 的使用方法:
NSLog(@"-- begin --");
// 创建一个分组
dispatch_group_t group = dispatch_group_create();
// 创建一个并发队列
dispatch_queue_t queue = dispatch_queue_create("com.jarypan.gcdsummary", DISPATCH_QUEUE_CONCURRENT);
// 向并发队列 queue 中追加任务并添加到分组 group 中
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"task1 -- %@", [NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"task2 -- %@", [NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"task3 -- %@", [NSThread currentThread]);
});
// 监听 group 中所有任务的完成状态
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"all tasks are finished -- %@", [NSThread currentThread]);
});
NSLog(@"-- end --");
首先,我们创建了一个分组(dispatch_group_t
类型),该分组用来添加一系列的任务;
然后,我们创建了一个并发队列,该并发队列用于接收后续的异步任务(GCD 中的任务必须追加到具体的队列中才能执行);
接着,我们利用 dispatch_group_async
方法将任务追加到并发队列中,并同时添加到分组中,完成了多个任务的异步封装;
最后,我们利用监听函数 dispatch_group_notify
来监听分组中所有任务的完成状态,一旦所有任务执行结束,就会自动追加一个任务到分组中,并在指定的队列中执行任务。
对于上面的代码,这个自动追加到分组中的任务就是:
[NSThread sleepForTimeInterval:2];
NSLog(@"all tasks are finished -- %@", [NSThread currentThread]);
而这个指