0

我在使用 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 个子上下文吗?我已经验证有时我的保存是由不同的上下文执行的。

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

4

1 回答 1

1

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

希望这可以帮助

于 2012-07-30T18:43:06.523 回答