在并行队列中,为了保持某些任务完成的顺序,需要等待一些任务完成后才能继续进行,使用barrier来等待之前任务完成,避免数据竞争等问题。
使用函数dispatch_barrier_async函数会等待追加到Concurrent Dispatch Queue并行对列中的操作全部执行完之后,然后再执行dispatch_barrier_async函数追加的处理,等dispatch_barrier_async追加的处理执行结束之后,Concurrent Dispatch Queue才恢复之前的动作继续执行。
(注意:)使用dispatch_barrier_async,该函数只能搭配自定义并行对列dispatch_queue_t使用。不能使用: dispatch_get_global_queue,否则dispatch_barrier_async的作用和dispatch_async的作用一模一样.
一般情况下,选择使用GCD的dispatch_after.
但是dispatch_after有个致命的弱点:dispatch_after一旦执行后,就不能撤销了。而performSelector可以使用cancelPreviousPerformRequestWithTarger方法撤销,NSTimer也可以调用invalidate进行撤销.
具体解决方法:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2.0*NSEC_PER_SEC, 0.1*NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
});
dispatch_resume(timer);
dispatch_source_cancel(timer);