iOS 多线程-GCD任务+队列.
iOS 多线程-GCD队列组.
iOS 多线程-GCD栅栏方法.
上一篇文章记录了队列组的使用,是为了处理多个任务之间的顺序。但是开发中会出现多组任务的顺序问题。
例如:现在有两组任务,每组任务中有多个任务需要并发处理,但是两组任务之间需要顺序执行。这个时候需要用到GCD多线程处理的另一种方式:栅栏方法(dispatch_barrier_async)。
栅栏方法(dispatch_barrier_async)
栅栏方法:就是像筑起一个栅栏一样,将队列中的多组线程任务分割开。
- (void)queueGroupBarrier{
//创建线程队列
dispatch_queue_t queue = dispatch_queue_create("barrier", DISPATCH_QUEUE_CONCURRENT);
//创建异步任务并添加到队列
dispatch_async(queue, ^{
//任务1
for (int i = 0; i < 3; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"任务1的执行=====%d", i);
}
});
//创建异步任务并添加到队列
dispatch_async(queue, ^{
//任务2
for (int i = 0; i < 3; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"任务2的执行=====%d", i);
}
});
dispatch_barrier_async(queue, ^{
//barrier任务
for (int i = 0; i < 3; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"barrier的执行=====%d", i);
}
});
//创建异步任务并添加到队列
dispatch_async(queue, ^{
//任务3
for (int i = 0; i < 3; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"任务3的执行=====%d", i);
}
});
//创建异步任务并添加到队列
dispatch_async(queue, ^{
//任务4
for (int i = 0; i < 3; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"任务4的执行=====%d", i);
}
});
}
打印结果:
2020-04-09 12:10:41.846262+0800 GCDdemo[10925:2318483] 任务1的执行=====0
2020-04-09 12:10:41.846268+0800 GCDdemo[10925:2318486] 任务2的执行=====0
2020-04-09 12:10:43.851721+0800 GCDdemo[10925:2318483] 任务1的执行=====1
2020-04-09 12:10:43.851754+0800 GCDdemo[10925:2318486] 任务2的执行=====1
2020-04-09 12:10:45.852175+0800 GCDdemo[10925:2318486] 任务2的执行=====2
2020-04-09 12:10:45.852192+0800 GCDdemo[10925:2318483] 任务1的执行=====2
2020-04-09 12:10:47.857707+0800 GCDdemo[10925:2318486] barrier的执行=====0
2020-04-09 12:10:49.863141+0800 GCDdemo[10925:2318486] barrier的执行=====1
2020-04-09 12:10:51.864232+0800 GCDdemo[10925:2318486] barrier的执行=====2
2020-04-09 12:10:53.868686+0800 GCDdemo[10925:2318488] 任务4的执行=====0
2020-04-09 12:10:53.868686+0800 GCDdemo[10925:2318486] 任务3的执行=====0
2020-04-09 12:10:55.873196+0800 GCDdemo[10925:2318488] 任务4的执行=====1
2020-04-09 12:10:55.873196+0800 GCDdemo[10925:2318486] 任务3的执行=====1
2020-04-09 12:10:57.878454+0800 GCDdemo[10925:2318486] 任务3的执行=====2
2020-04-09 12:10:57.878454+0800 GCDdemo[10925:2318488] 任务4的执行=====2
从上面的代码和打印结果可以看出,barrier任务将1、2和3、4两组任务进行了分割。
这里需要注意的是,需求描述为多组项目,但是在开发中,线程队列只有一个,barrier实际上是在一个队列中筑起的。