dispatch_barrier_async 可以提供一个'栅栏'将两组异步执行的任务分隔开,保证先于栅栏的方法提交到队列的任务全部执行完成之后,开放栅栏,将栅栏之后的任务组调到队列中执行。
示例代码
- (void)barrier_display{
NSLog(@"当前线程------%@",[NSThread currentThread]);
dispatch_queue_t theConcurrentQueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t theQueue = theConcurrentQueue;
dispatch_async(theQueue, ^{
NSLog(@"任务1开始");
[NSThread sleepForTimeInterval:2];
NSLog(@"任务1完成");
});
dispatch_async(theQueue, ^{
NSLog(@"任务2开始");
[NSThread sleepForTimeInterval:2];
NSLog(@"任务2完成");
});
dispatch_barrier_async(theQueue, ^{
NSLog(@"栅栏任务!!!");
});
dispatch_async(theQueue, ^{
NSLog(@"任务3开始");
[NSThread sleepForTimeInterval:2];
NSLog(@"任务3完成");
});
dispatch_async(theQueue, ^{
NSLog(@"任务4开始");
[NSThread sleepForTimeInterval:2];
NSLog(@"任务4完成");
});
}
当前线程------<NSThread: 0x6000019e4080>{number = 1, name = main}
任务1开始
任务2开始
任务1完成
任务2完成
=======栅栏任务=============
任务3开始
任务4开始
任务4完成
任务3完成
看源码
void
dispatch_barrier_async(dispatch_queue_t dq, dispatch_block_t work)
{
dispatch_continuation_t dc = _dispatch_continuation_alloc();
uintptr_t dc_flags = DC_FLAG_CONSUME | DC_FLAG_BARRIER;
dispatch_qos_t qos;
qos = _dispatch_continuation_init(dc, dq, work, 0, dc_flags);
_dispatch_continuation_async(dq, dc, qos, dc_flags);
}
将改成同步栅栏+并发队列也可以实现
dispatch_barrier_sync(theQueue, ^{
NSLog(@"=======栅栏任务=============");
});