核心数据在NSOperation和同步中插入对象

时间:2014-05-19 14:40:06

标签: objective-c core-data concurrency nsoperation

我正在NSOperation中保存网络响应中的对象。据我了解合并MOC从后台线程到main的更改,我可以将mergeChangesFromContextDidSaveNotificationperformBlock与父上下文一起使用。

我更喜欢使用mergeChangesFromContextDidSaveNotificationperformBlock? 每种合并方法的优缺点是什么?

NSOperation在后​​台环境中执行。那么当我打电话给performBlock时会不会创建新线程?

3 个答案:

答案 0 :(得分:1)

答案在很大程度上取决于您的背景MOC是否将主要MOC作为父母。

如果您正在使用具有私有/主要队列并发性的MOC,则只需使用performBlock

如果您是,要在相应的正确队列中执行命令,您可以使用performBlock

因此,即使您必须使用mergeChanges - 而且您不必使用子语境 - 您也可以将mergeChanges嵌套在performBlock中!但是,您不必使用子环境的原因是因为您的背景线程" MOC 应该可以是主线程MOC的子代。所以你要做的就是save孩子将变化合并到父母中。 (注意父母也需要保存)

回到这个问题:

  • mergeChanges如果您将更改从子级推送到父级MOC并保存在子级中
  • 如果您使用具有不同并发类型的多个MOC,则在任何地方使用performBlock但在主线程上的mainQueueMOC上的操作

答案 1 :(得分:0)

我不确定您提到的两种方法是否提供了相同的功能:您使用performBlock在接收方管理对象上下文的步骤中执行随机代码。并使用mergeChangesFromContextDidSaveNotification从另一个上下文保存处理NSNotification。如果我直到这里,你唯一选择的是后者。

您可以在NSOperation内创建子上下文,子上下文中保存的数据会自动传播到父上下文中。

进一步详细说明,您将使用performBlock从后台修改父对象的托管对象 - 它基本上会将您调度到托管对象上下文的线程,以允许以安全的方式执行操作

答案 2 :(得分:0)

在我的问题上搜索答案时,我找到了Concurrent Core Data Stacks Performance条。本文回答说,如果您使用mergeChangesFromContextDidSaveNotification方法使用包含同步数据的旧核心数据堆栈,则可以获得更好的性能。 我还发现了苹果示例ThreadedCoreData。在此示例中,他们仍然使用mergeChangesFromContextDidSaveNotification同步。

所以回答我的问题是,如果你继续表现,你应该使用mergeChangesFromContextDidSaveNotification,如果你更简单的实现你应该使用嵌套的上下文。