【问题标题】:Sibling NSManagedObjectContexts when using NSOperations使用 NSOperations 时的兄弟 NSManagedObjectContexts
【发布时间】:2012-07-30 17:59:37
【问题描述】:

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

如果有任何建议,我将不胜感激。谢谢。

【问题讨论】:

    标签: ios core-data nsoperation nsoperationqueue magicalrecord


    【解决方案1】:

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

    希望对你有帮助

    【讨论】:

    • 我也在考虑重置,但很谨慎。我会试一试,看看它的表现如何并发回。谢谢!
    • 终于有时间尝试了,调用'reset'解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多