NSOperation VS GCD for Core-Data

时间:2012-08-25 22:50:01

标签: ios core-data grand-central-dispatch nsoperation

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

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

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

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

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时,您同意签订类似的合同。

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

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

  2. 如果我使用performBlock,我只会在performBlockAndWaitNSMainQueueConcurrencyType中使用MOC。

  3. 如果我使用performBlock,我将只使用performBlockAndWaitperformBlock内的MOC,或者当我知道我在主线程上运行时。< / p>

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

    具体来说,使用{{1}}时,Core Data API将确保代码正确同步。

答案 1 :(得分:1)