我有一个“sharedStore” - 模式的单身人士的NSMutableArray。NSMutableArray线程并发与GCD
公开地说,它只能通过将其转换为NSArray的方法访问。在类,它是
@property (nonatomic, copy) NSMutableArray *myItems;
这个数组永远不会被操纵outsdie单身,但ViewControllers发送单消息来操作该控制器。其中一些消息清空阵列,一些重新填充它,等等。
已经结束了在一个方法调用中数组为空而下一个方法尚未空的情况下,我开始实现一些并发行为。
下面是我在做什么至今:
在单身的.m文件,我有一个
@property (nonatomic, strong) dispatch_queue_t arrayAccessQueue;
在我单身的初始化它被创建为一个串行队列。然后,每一个有什么关系改变此数组从dispatch_sync
电话中这样做,例如方法:
dispatch_sync(self.arrayAccessQueue, ^{
[_myItems removeAllObjects];
});
这更好的事情做,并取得了我的应用程序表现得更加顺畅。然而,除了修正上述一个奇怪的行为之外,我无法量化它。我也觉得我在黑暗中可能潜伏在表面之下的任何问题。
这种模式对我有意义,但我应该使用别的东西,如@synchronize
或NSLock
或NSOperationQueue
?这会回来咬我吗?
顺便说一句 - 你是否正确地为你的'myItems'属性实现了一个明确的setter方法?如果不是,由于mutable属性上的'copy'属性,你将会遇到问题。 – rmaddy
嗯。我不知道。你的意思是'_myItems = [myItems copy]'?我认为编译器现在自动执行了这个操作,而且它不需要再明确地完成了?我错了吗? – magiclantern
问题在于[myItems copy]返回一个'NSArray',而不是'NSMutableArray',即使在可变数组上调用时也是如此。你需要重写'setMyItems:'方法并调用mutableCopy'。 – rmaddy