dispatch_barrier_async
在访问数据库或文件时,使用Serial Dispatch Queue可避免数据竞争的问题。
写入处理确实不可与其他的写入处理以及包含读取处理的其他某些问题并行执行。但是如果读取处理只是与读取处理并行执行,那么多个并行执行就不会发生问题。
为了高效率地进行访问,读取处理追加到Concurrent Dispatch Queue中,写入处理在任一个读取处理没有执行的状态下,追加到Serial Dispatch Queue 中即可(在写入处理结束之前,读取处理不可执行)。
解决方法:dispatch_barrier_async函数同dispatch_create_queue函数生成的Concurrent Dispatch Queue一起使用。
首先dispatch_queue_create函数生成Concurrent Dispatch Queue,在dispatch_async中追加读取处理。
dispatch_queue_t queue = dispatch_queue_create("com.example.gcd.ForBarrier",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue,blk0_for_reading);
dispatch_async(queue,blk1_for_reading);
dispatch_async(queue,blk2_for_reading);
dispatch_async(queue,blk3_for_reading);
dispatch_async(queue,blk4_for_reading);
dispatch_async(queue,blk5_for_reading);
dispatch_async