代码之家  ›  专栏  ›  技术社区  ›  Duane Fields

避免在多个nsmanagedObjectContext之间进行无限递归同步

  •  1
  • Duane Fields  · 技术社区  · 14 年前

    设置:

    我有两个托管上下文设置(在iPhone应用程序上)。我用于大多数查询的主上下文,以及我用于希望在后台发生的长时间运行操作的后台上下文。

    我已经针对每个托管对象上下文为nsManagedObjectContextDidSaveNotification设置了通知。为了响应通知,我调用MergeChangesFromContextDidSaveNotification进行同步。这也是一个要求,当主上下文中的事情发生变化时,我需要在后台上下文中运行一些作业,因为现在事情的状态已经发生了变化。

    只要只写在其中一个上下文中,这就行了。在这种情况下,写的是主上下文。但是,如果我写在背景上下文上,这会导致一个无限循环。保存在后台上下文上会触发到主上下文的通知,而主上下文又会合并更改并触发由后台上下文获取的自己的通知。这将触发后台上下文来执行其后台作业,如果它们写了任何东西,则会再次启动循环。

    似乎这是错误的设置,或者我需要一种方法将“在主上下文发生更改时开始处理后台作业”与更改通知分离,或者我需要使后台上下文为只读。

    思想?与典型的“第二个上下文用于导入”场景不同,我认为我需要/希望我的背景上下文在主上下文方面保持最新,以便从我的背景工作中获得正确的结果。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Marcus S. Zarra    14 年前

    听起来像是设计问题。虽然您可能会绕过它,但您应该考虑避免拥有“永久”的背景上下文。我通常建议每个操作都要有一个上下文(对于这个上下文,nsOperations的工作效果很好),然后在一个任务完成时扔掉它们。这避免了保持多个上下文同步的需要,因为您只需要更新主上下文。

    为什么你认为你需要一个永久的背景背景?如果原因是性能,你分析过吗?

        2
  •  0
  •   Raphael Schweikert miya    14 年前

    你可以创建一个 NSSet 对于包含所有 NSNotifications 你已经收到了。每当你有另一个电话,在打电话前先核对一下。 mergeChangesFromContextDidSaveNotification . 想想看,为任何上下文存储最后一个应该足够了。