使用线程的方式,可以通过GCD。
并发的后台任务,可以通过创建并发列队来实现。全局列队就是一个并发列队。
并发列队,执行的时候是并发的,GCD实现的时候会开启多线程。
串行列队,任务可以异步的放入队列,执行的时候会按照FIFO的顺序执行。因为是串行的,同一个串行列队不会有并发带来的各种问题。如果是主列队则不会创建新线程。
dispatch_async 时会拷贝 block,当拷贝 block 的时间大于执行 block 的时间时,dispatch_async 的速度会比 dispatch_sync 速度更慢。所以实际情况应根据 block 所执行任务的繁重程度来决定使用 dispatch_async 还是 dispatch_sync。
多个获取方法可以并发执行,获取方法与设置方法不能并发执行。据此可以使用全局并发队列和 GCD 的 dispatch_barrier_async 来实现。
dispatch_barrier_async函数,在该方法执行之前,之后的block是没有添加到队列中去的。dispatch_barrier_async会等待concurrent上的任务全部结束之后,再将指定的任务追加到队列中,然后dispatch_barrier_async函数追加的处理执行完后,concurrent队列开始并行执行。
- (id)objectAtIndex:(NSUInteger)index { __block id obj; dispatch_sync(self.concurrentQueue, ^{ obj = [self.array objectAtIndex:index]; }); return obj; } - (void)insertObject:(id)obj atIndex:(NSUInteger)index { dispatch_barrier_async(self.concurrentQueue, ^{ [self.array insertObject:obj atIndex:index]; }); }