5

什么更适合数据需要在一个线程上存储在 Core-Data 中并从另一个线程上从 Core-Data 读取的情况?

我在考虑 GCD,但它如何与为每个线程创建 NSManagedObjectContext 一起工作?如何在队列中创建这些对象?

当在各个线程上进行更改时,需要更新/同步数据存储,这对 GCD 或 NSOperation 更好吗?

我希望能够根据需要在读取和写入数据存储时将块传递到 2 个队列,而不会出现损坏存储或存储不同版本的问题。

4

2 回答 2

16

GCD 和 GCD 之间的争论NSOperation基本上可以归结为使用最高级别的抽象来为您提供一个好的解决方案。

NSOperationQueue是建立在 GCD 之上的,所以它一定是更高层次的抽象。

但是,GCD 在一般情况下非常容易使用,我发现NSOperationQueue在许多情况下它更可取。

现在,当您将 CoreData 加入其中时,我会建议第三种选择。如果您使用的是 iOS 5,那么您可以将私有队列并发与您的 MOC 一起使用。我发现这是一个很好的抽象,并提供了一个易于使用的界面。

因此,我建议您简单地NSPrivateQueueConcurrencyType为每个要执行 Core Data 的线程创建一个 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
}];

当然,您必须选择一种方法(对现有 MOC 进行育儿或附加到 PSC)。

我通常更喜欢这种performBlock方法。

编辑

谢谢。我读到 NSManagedObject 不是线程安全的。我将如何在该私有队列上创建新的 NSManagedObjects?– 氦气3

是的,这是真的。但是,当您创建具有并发类型的 MOC 时,您就同意了类似这样的合同。

我,一个精明的程序员,郑重同意以下关于并发的核心数据规则:

  1. 如果我使用NSConfinementConcurrencyType,我只会在创建它的线程上运行时使用它。

  2. 如果我使用NSPrivateQueueConcurrencyType,我只会在performBlock或中使用 MOC performBlockAndWait

  3. 如果我使用NSMainQueueConcurrencyType,我只会在 、 或当我知道我在主线程上运行时使用performBlockMOC performBlockAndWait

如果您遵循这些规则,那么您将能够在其他线程上使用 MOC。

具体来说,在使用 时performBlock,Core Data API 将确保代码适当地同步。

于 2012-08-25T23:03:53.313 回答
1

您的所有问题都已通过 iOS 5 中的新上下文并发类型得到解决,甚至更多:

http://developer.apple.com/library/mac/#releasenotes/DataManagement/RN-CoreData/_index.html

http://www.cocoanetics.com/2012/07/multi-context-coredata/

于 2012-08-25T23:03:23.873 回答