Ios 核心数据的NSO操作与GCD

Ios 核心数据的NSO操作与GCD,ios,core-data,grand-central-dispatch,nsoperation,Ios,Core Data,Grand Central Dispatch,Nsoperation,在需要将数据存储在一个线程的核心数据中,并从另一个线程的核心数据中读取数据的情况下,什么更适合 我在考虑GCD,但它如何与为每个线程创建NSManagedObjectContext一起工作?如何在队列中创建这些对象 在不同线程上进行更改时,需要更新/同步数据存储,这是使用GCD还是NSO操作更好 我希望在需要时读取和写入数据存储时,能够将块传递到2个队列,而不会损坏存储或存储的不同版本。iOS 5中的新上下文并发类型解决了您的所有问题,更多问题: GCD和NSOperation之间的争论基本上

在需要将数据存储在一个线程的核心数据中,并从另一个线程的核心数据中读取数据的情况下,什么更适合

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

在不同线程上进行更改时,需要更新/同步数据存储,这是使用GCD还是NSO操作更好


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

iOS 5中的新上下文并发类型解决了您的所有问题,更多问题:


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
}];
当然,您必须选择一种方法(要么作为现有MOC的子对象,要么附加到PSC)

我通常更喜欢
performBlock
方法

编辑


谢谢。我读到NSManagedObject不是线程安全的。我该怎么做 在该专用队列上创建新的NSManagedObject?–氦

是的,确实如此。然而,当您创建一个并发类型的MOC时,您同意这样一个契约

一、 作为一名精明的程序员,请郑重同意以下关于并发性的核心数据规则:

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

  • 如果我使用
    NSPrivateQueueConcurrencyType
    ,我将仅从
    performBlock
    performBlockAndWait
    中使用MOC

  • 如果我使用
    NSMainQueueConcurrencyType
    ,我将只在
    performBlock
    performBlock和wait
    中使用MOC,或者在我知道我正在主线程上运行时使用MOC

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


    具体来说,当使用
    performBlock
    时,核心数据API将确保代码正确同步。

    谢谢。我读到NSManagedObject不是线程安全的。如何在该专用队列上创建新的NSManagedObjects?谢谢您的编辑。因此,如果NSManageObjects被添加到存储或由MOC并发编辑,则无需手动同步存储?抱歉,我没有回答这个问题。