dispatch_barrier_async和dispatch_barrier_sync是 GCD 中的两个方法。是不是和dispatch_async及dispatch_sync长得很像,就是多了一个barrier(译:栅栏)。
没错,除了有dispatch_async或dispatch_sync的作用外(是否阻塞当前线程),还有“栅栏”的效果。
意思就是,在该队列,以他们为界,待前面任务执行完成,再把自己内部的任务执行完,才会执行后面的任务。
知道和dispatch_async及dispatch_sync对应,就应该想到:
dispatch_barrier_async不阻塞当前线程,dispatch_barrier_async里面的任务异步执行。
dispatch_barrier_sync会阻塞当前线程,dispatch_barrier_sync里面的任务同步执行。
例: dispatch_barrier_async
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQ", DISPATCH_QUEUE_CONCURRENT);
//以下任务
dispatch_async(concurrentQueue, ^{ NSLog(@"任务1"); });
dispatch_async(concurrentQueue, ^{ NSLog(@"任务2"); });
dispatch_async(concurrentQueue, ^{ NSLog(@"任务3"); });
dispatch_barrier_async(concurrentQueue, ^{
sleep(1);
NSLog(@"I am barrier");
});
NSLog(@"当前线程");
dispatch_async(concurrentQueue, ^{ NSLog(@"任务4"); });
dispatch_async(concurrentQueue, ^{ NSLog(@"任务5"); });
打印:
例: dispatch_barrier_sync
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQ", DISPATCH_QUEUE_CONCURRENT);
//以下任务
dispatch_async(concurrentQueue, ^{ NSLog(@"任务1"); });
dispatch_async(concurrentQueue, ^{ NSLog(@"任务2"); });
dispatch_async(concurrentQueue, ^{ NSLog(@"任务3"); });
dispatch_barrier_sync(concurrentQueue, ^{
sleep(1);
NSLog(@"I am barrier");
});
NSLog(@"当前线程");
dispatch_async(concurrentQueue, ^{ NSLog(@"任务4"); });
dispatch_async(concurrentQueue, ^{ NSLog(@"任务5"); });
打印:
注:
1.任务1,2,3是无序的。任务4,5是无序的。
2.I am barrier是任务1,2,3与任务4,5的分界线,总是等任务1,2,3执行完,然后I am barrier执行完,才会执行任务4,5。
3.dispatch_barrier_async会阻塞,dispatch_barrier_sync不会阻塞