NSOperation VS GCD for Core-Data

jar*_*ryd 5 core-data nsoperation grand-central-dispatch ios

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

我在考虑GCD但是它如何为每个线程创建NSManagedObjectContext?如何在队列中创建这些对象?

在对各种线程进行更改时,需要更新/同步数据存储,这与GCD或NSOperation有关吗?

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

Jod*_*ins 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
}];
Run Code Online (Sandbox Code Playgroud)

当然,您必须选择一种方法(为现有MOC提供父母或附加到PSC).

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

编辑

谢谢.我读到NSManagedObject不是线程安全的.如何在该专用队列上创建新的NSManagedObject? - 氦3

是的,这是事实.但是,当您创建具有并发类型的MOC时,您同意签订类似的合同.

我,一个精明的程序员,庄严地同意以下有关并发的核心数据规则:

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

  2. 如果我使用NSPrivateQueueConcurrencyType,我将只使用MOC从内任一performBlockperformBlockAndWait.

  3. 如果我使用NSMainQueueConcurrencyType,我将只使用MOC从内部或者performBlock,performBlockAndWait或者当我知道我在主线程上运行.

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

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