- dispatch_barrier_async函数会等待栅栏函数前边追加到并发队列中的任务全部执行完毕之后,再将指定的任务追加到栅栏函数的并发队列中。然后在dispatch_barrier_async函数追加的任务执行完毕之后,并发队列才恢复为一般动作,接着追加任务到栅栏函数后的并发队列并开始执行。
- 使用栅栏函数使用自己创建的并发队列,不要使用系统提供的全局并发队列
#pragma mark 栅栏函数
- (void)gcd_dispatch_barrier {
NSLog(@"dispatch_barrier --- begin");
dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
//追加任务1
NSLog(@"追加任务1");
for (int i = 0; i < 2; ++i) {
//模拟耗时操作
[NSThread sleepForTimeInterval:2];
//打印当前线程
NSLog(@"1---%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
//追加任务2
NSLog(@"追加任务2");
for (int i = 0; i < 2; ++i) {
//模拟耗时操作
[NSThread sleepForTimeInterval:2];
//打印当前线程
NSLog(@"2---%@",[NSThread currentThread]);
}
});
dispatch_barrier_async(queue, ^{
//追加栅栏函数任务
NSLog(@"追加栅栏函数任务");
for (int i = 0; i < 2; ++i) {
//模拟耗时操作
[NSThread sleepForTimeInterval:2];
//打印当前线程
NSLog(@"barrier---%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
//追加任务3
NSLog(@"追加任务3");
for (int i = 0; i < 2; ++i) {
//模拟耗时操作
[NSThread sleepForTimeInterval:2];
//打印当前线程
NSLog(@"3---%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
//追加任务4
NSLog(@"追加任务4");
for (int i = 0; i < 2; ++i) {
//模拟耗时操作
[NSThread sleepForTimeInterval:2];
//打印当前线程
NSLog(@"4---%@",[NSThread currentThread]);
}
});
//不需要等待,直接执行
NSLog(@"dispatch_barrier --- end");
}
在执行完栅栏前面的操作之后,才执行栅栏操作,最后再执行栅栏后边的操作。
屏幕快照 2020-07-06 上午11.27.58.png
网友评论