使用NSOperations时同步NSManagedObjectContext

时间:2012-07-30 17:59:38

标签: ios core-data nsoperation nsoperationqueue magicalrecord

在使用NSOperations的多线程应用程序中使用CoreData时遇到了一些麻烦。我通过MagicalRecord(2.0.3)使用嵌套的ManagedObjectContexts,如下所示:

Root Context (saves to disk)
|
Main Thread Context (for populating the UI)
|
Sub-Context(s) (used to add/edit/remove data)

我有一个NSOperationQueue来处理所有数据处理。

在大多数情况下,事情正常,我可以异步下载数据,然后将其提供给NSOperation,然后将其写入其中一个子上下文。在操作结束时保存将更改推送到主上下文和UI更新。太好了!

问题在于,如果子上下文删除实体并保存(将其推送到主上下文),则兄弟子上下文仍将认为它存在。那么,如果一个兄弟试图对实体进行故障并将其从它的父节点(主要上下文)中拉出来,我就会崩溃。

我有两个问题:

  • 我是否应该使用MOC通知将推送到主MOC的更改合并回给其他孩子?我这是另一次崩溃......
  • 我是否应该有多个子上下文? MOC应该与一个线程相关联(MagicalRecord帮助我自动化),我有一个NSOperationQueue用于保存数据,所以我不应该只有1个子上下文吗?我已经确认有时我的保存是由不同的上下文执行的。

我很感激任何建议。感谢。

1 个答案:

答案 0 :(得分:1)

您可以而且应该拥有多个子上下文。但是,我不确定上下文的经典“线程隔离模式”是否应该是您应该拥有的模型。当你说上下文属于某个特定线程时,这就是你正在做的事情。 MagicalRecord 2.0x现在使用私有队列上下文,因此会有不同的表现。没有规则说兄弟情境需要保持同步。你必须自己做。一个非常简单的解决方案是在您正在保存的上下文中侦听“已保存”通知,并重置或在另一个线程上创建新上下文。您可以使用MagicalRecord提供的通知或完成黑色来执行此操作。

希望这有帮助