barrier是栅栏的意思,dispatch_barrier_sync和dispatch_barrier_async 都有类似的功能,即在栅栏操作结束后再执行某些操作。
两者的区别是一个阻塞当前线程,一个不阻塞。
上代码:
dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myQueue,^(void){
NSLog(@"thread1");
});
dispatch_async(myQueue,^(void){
NSLog(@"thread2");
});
dispatch_barrier_sync(myQueue, ^{
NSLog(@"this is barrier");
[NSThread sleepForTimeInterval:5];
});
NSLog(@"hello world");
dispatch_async(myQueue, ^{
NSLog(@"thread3");
});
dispatch_async(myQueue, ^{
NSLog(@"thread4");
});
当使用dispatch_barrier_sync时,程序内容依次执行,加入到队列中的操作也是依次执行。
输出结果:
2018-07-17 08:50:21.532307+0800 NavBarTest[9869:43411] thread1
2018-07-17 08:50:21.532309+0800 NavBarTest[9869:41271] thread2
2018-07-17 08:50:21.532459+0800 NavBarTest[9869:41217] this is barrier
2018-07-17 08:50:26.533880+0800 NavBarTest[9869:41217] hello world
2018-07-17 08:50:26.534185+0800 NavBarTest[9869:43426] thread3
2018-07-17 08:50:26.534192+0800 NavBarTest[9869:41271] thread4
当使用dispatch_barrier_async时,加入到队列中的操作有栅栏效应,但当前程序内容并不受影响,没有被阻塞,所以hello world可能先被执行。
输出结果:
2018-07-17 08:52:37.155288+0800 NavBarTest[9928:44661] hello world
2018-07-17 08:52:37.155288+0800 NavBarTest[9928:44694] thread1
2018-07-17 08:52:37.155290+0800 NavBarTest[9928:44693] thread2
2018-07-17 08:52:37.155551+0800 NavBarTest[9928:44693] this is barrier
2018-07-17 08:52:42.156796+0800 NavBarTest[9928:44694] thread4
2018-07-17 08:52:42.156796+0800 NavBarTest[9928:44693] thread3