什么更适合需要将数据存储在一个线程上的Core-Data中并从另一个线程上的Core-Data读取数据的情况?
我在考虑GCD但是如何为每个线程创建NSManagedObjectContext?如何在队列中创建这些对象?
在对各种线程进行更改时,需要更新/同步数据存储,这与GCD或NSOperation有关吗?
我希望能够在根据需要读取和写入数据存储时将块传递给2个队列,而不会出现损坏存储或存储不同版本的问题。
答案 0 :(得分:16)
GCD和NSOperation
之间的争论基本上归结为使用最高级抽象的论点,为您提供了一个很好的解决方案。
NSOperationQueue
建立在GCD之上,因此它必须是更高级别的抽象。
但是,GCD在一般情况下非常容易使用,我觉得在很多情况下它更适合NSOperationQueue
。
现在,当你将CoreData带入混合体时,我会建议第三种选择。如果您使用的是iOS 5,那么您可以在MOC中使用私有队列并发。我发现这是一个很好的抽象,并提供了一个易于使用的界面。
因此,我建议您只为每个要进行核心数据的线程创建一个NSPrivateQueueConcurrencyType
的MOC。您可以根据应用程序特征选择是共享persistentStoreCoordinator
还是使用单独的NSManagedObjectContext *moc = [[NSManagedObjectCotext alloc] initWithConcurrencyType:NSPrivateQueuqConcurrencyType];
moc.parentContext = contextIWantToBeParent;
moc.persistentStoreCoordinator = pscIWant;
[moc performBlock:^{
// Your MOC stuff running on its own private queue
}];
。你甚至可以使用嵌套的上下文(对于插入端有一个警告)。
基本上,它遵循这个模型......
performBlock
当然,您必须选择一种方法(为现有MOC提供父母或附加到PSC)。
我通常更喜欢NSConfinementConcurrencyType
方法。
修改强>
感谢。我读到NSManagedObject不是线程安全的。我怎么样? 在该私有队列上创建新的NSManagedObjects? - Helium3
是的,这是事实。但是,当您使用并发类型创建MOC时,您同意签订类似的合同。
我是一位精明的程序员,庄严地同意以下关于并发性的核心数据规则:
如果我使用NSPrivateQueueConcurrencyType
,我只会在创建它的线程上运行时使用它。
如果我使用performBlock
,我只会在performBlockAndWait
或NSMainQueueConcurrencyType
中使用MOC。
如果我使用performBlock
,我将只使用performBlockAndWait
,performBlock
内的MOC,或者当我知道我在主线程上运行时。< / p>
如果您遵循这些规则,那么您将能够在其他线程上使用MOC。
具体来说,使用{{1}}时,Core Data API将确保代码正确同步。
答案 1 :(得分:1)