继续总结和备忘:
- dispatch_barrier_async函数
该函数会等待追加到concurrent dispatch queue上的并行执行的处理结束之后,再将指定的处理( dispatch_barrier_async自己携带的代码块任务)追加到该concurrent dispatch queue中。然后在由dispatch_barrier_async函数追加的处理执行完毕之后,concurrent dispatch queue才恢复为一般的动作,追加到该concurrent dispatch queue的处理又开始并行执行;
dispatch_async(queue, ^{ /*处理1*/ });
dispatch_async(queue, ^{ /*处理2*/ });
dispatch_async(queue, ^{ /*处理3*/ });
dispatch_barrier_async(queue, ^{ /*处理xxx*/ });
dispatch_async(queue, ^{ /*处理4*/ });
dispatch_async(queue, ^{ /*处理5*/ });
dispatch_async(queue, ^{ /*处理6*/ });
这个处理1、2、3会先并行处理完毕,接着处理xxx,xxx处理完毕之后,再接着并行处理4、5、6。
使用concurrent dispatch queue和dispatch_barrier_asyn函数可以实现高效的数据库访问和文件访问。
对应的dispatch_barrier_sync函数,跟dispatch_barrier_async的区别是:
dispatch_barrier_async将自己的任务插入到队列之后,不会等待自己的任务结束,它会继续把后面的任务插入到队列,然后等待自己的任务结束后才执行后面任务;dispatch_barrier_sync将自己的任务插入到队列的时候,需要等待自己的任务结束之后才会继续插入被写在它后面的任务,然后执行它们
- 简单又不简单的dispatch_async和dispatch_sync
- async就是将指定的block任务追加到queue后,dispatch_async函数不做任何等待,继续执行当前线程后续代码。
- sync就是在追加指定的block后,dispatch_sync函数会一直等待,直到追加的block结束。
- 所以dispatch_sync函数要注意死锁。