假如现在有几组任务,我们并不关心每组中的各个任务的执行顺序,但是我们要求这几组任务按顺序分批进行,也就是说第一组任务全部执行之后,再启动第二组任务,以此类推。在这种情况下,我们使用 dispatch_barrier
函数将会非常高效,dispatch_barrier
函数又称作栅栏函数,顾名思义,就是像栅栏一样可以把不同任务分开。
在下面例子中,我们假设有两组任务,第一组包含任务 1 和任务 2,第二组包含任务 3 和任务 4,要求第一组任务执行完后再开始执行第二组任务:
NSLog(@"-- start --");
// 创建一个并行队列
dispatch_queue_t queue = dispatch_queue_create("com.jarypan.gcdsummary", DISPATCH_QUEUE_CONCURRENT);
// 向队列中追加任务
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:1]; // 模拟耗时操作
NSLog(@"task1 -- %@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:1]; // 模拟耗时操作
NSLog(@"task2 -- %@", [NSThread currentThread]);
});
// 使用栅栏函数
dispatch_barrier_async(queue, ^{
[NSThread sleepForTimeInterval:1]; // 模拟耗时操作
NSLog(@"barrier task -- %@", [NSThread currentThread]);
});
// 在栅栏函数后边继续追加任务
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:1]; // 模拟耗时操作
NSLog(@"task3 -- %@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:1]; // 模拟耗时操作
NSLog(@"task4 -- %@", [NSThread currentThread]);
});
NSLog(@"-- end --");
运行后查看打印信息:
2019-09-22 01:09:31.383838+0800 GCDSummary[33672:1003194] -- start --
2019-09-22 01:09:31.384070+0800 GCDSummary[33672:1003194] -- end --
2019-09-22 01:09:32.388449+0800 GCDSummary[33672