NSMutableArray与GCD的线程并发

时间:2015-05-29 14:28:51

标签: ios objective-c multithreading cocoa-touch

我在" sharedStore" -pattern singleton中有一个NSMutableArray。

公开地说,它只能通过将其转换为NSArray的方法来访问。在课堂上,它是

@property (nonatomic, copy) NSMutableArray *myItems;

这个数组永远不会被操作超过单例,但ViewControllers会发送单例消息来操纵这个控制器。其中一些消息清空了数组,一些消息重新填充,等等。

在一个方法调用中数组为空而在下一个方法调用中尚未为空的情况下,我开始实现一些并发行为。

以下是我到目前为止所做的事情:

在单身人士的.m文件中,我有一个

@property (nonatomic, strong) dispatch_queue_t arrayAccessQueue;

在我的单例初始化程序中,它被创建为一个串行队列。然后,每个与变换此数组有关的方法都是在dispatch_sync调用中完成的,例如:

dispatch_sync(self.arrayAccessQueue, ^{
    [_myItems removeAllObjects];
});

这使事情变得更好,并使我的应用程序表现得更顺畅。但是,除了固定上述一种奇怪行为之外,我无法量化它。我也有点觉得我在黑暗中可能潜伏在表面下的任何问题。

这种模式对我有意义,但是我应该使用其他内容,例如@synchronizeNSLockNSOperationQueue吗?这会回来咬我吗?

3 个答案:

答案 0 :(得分:4)

只要您包装所有数组读写并确保它是一个串行队列,就可以使用dispatch_sync

但是你可以通过允许并发读取来改进。为此,请在所有数组读取周围使用dispatch_sync,并在所有数组写入周围使用dispatch_barrier_sync。并将队列设置为并发。

这样做确保一次只能进行一次写操作,读操作将一直阻塞,写操作完成后,写操作将等到所有当前读操作完成。

答案 1 :(得分:1)

使用并行的GCD队列并为您的阵列提供一种访问器,您可以在读取时使用dispatch_sync同步读取和写入,并在写入时使用dispatch_barrier_async来同步读取和写入。

- (id)methodToRead {
  id __block obj = nil;
  dispatch_sync(syncQueue, ^{
     obj = <#read_Something#>;
  });
  return obj;
}

- (void) methodsForWriting:(id)obj {
   dispatch_barrier_async(syncQueue, ^{
    // write passing obj to something
  });
}

这将保证在写作过程中所有内容都无法阅读。

答案 2 :(得分:0)

使用GCD是正确的选择。唯一的&#34;陷阱&#34;是你需要对该队列进行所有操作:添加,删除,插入等。

我还要提到您需要确保不使用并发队列。你应该使用一个串行队列,这是默认的。