使用线程的方式,可以通过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];
  });
}

 

posted on 2013-05-08 20:36  一路转圈的雪人  阅读(188)  评论(0编辑  收藏  举报