问题情景:
原先有几个并行执行的操作:1,2,3,4,5,6
如果我想要在1,2,3执行完毕后,执行A操作,然后再执行4,5,6该怎么办呢?
此时,栅栏函数就站出来了。
先使用dispatch_barrier_sync函数试试水:
屏幕快照 2017-03-10 下午2.11.37.png
结果:
屏幕快照 2017-03-10 下午2.48.05.png
此时,操作1,2,3执行完毕后(并发执行,请忽略顺序),开始调用barrier操作。然后是4,5,6操作。完全满足要求。
然后我们再来试试dispatch_barrier_async:
屏幕快照 2017-03-10 下午2.55.21.png
调用的结果:
屏幕快照 2017-03-10 下午2.56.20.png
dispatch_barrier_sync与dispatch_barrier_async的共同点:
都会等待在它前面插入队列的任务(这里就是1,2,3)先执行完。
都会等待他们自己的任务(barrier operation)执行完之后再执行后面的任务(4,5,6)。
dispatch_barrier_sync与dispatch_barrier_async的不同点:
将任务插入到queue的时候,dispatch_barrier_sync需要等待自己的任务(barrier operation)执行完毕后,才会插入后面的任务(4,5,6),然后执行后面的任务。
dispatch_barrier_async将自己的任务插入到queue之后,不会等待自己的任务(barrier operation)执行结果,它会继续插入后面的任务。
所以dispatch_barrier_async的特性:
在插入队列的时候是异步的,在任务真正执行的过程中是串行的。
dispatch_barrier_sync的特性:
在插入队列的时候是串行的,在任务真正执行的过程中也是串行的。
一图解释之:
屏幕快照 2016-07-05 11.16.59.png
加油~