避免多个NSManagedObjectContext之间的无限递归同步

时间:2010-07-28 22:01:07

标签: iphone objective-c core-data nsmanagedobjectcontext

设置:

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

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

这样可以正常工作,只要在其中一个上下文中写入即可。在这种情况下,写在主要上下文。但是,如果我在背景上下文中写入,则会导致无限循环。保存在后台上下文会触发对主上下文的通知,主上下文会合并更改并触发自己的通知,由后台上下文选取。这会触发后台上下文来执行后台作业,如果它们写任何内容,则会再次启动循环。

似乎这是错误的设置,或者我需要一种方法来从更改通知中解除“在主要上下文中发生某些变化时开始处理后台作业”,或者我需要将背景上下文读取 - 仅

想法?与典型的“第二上下文是导入”方案不同,我认为我需要/希望我的背景上下文与主要上下文保持同步,以便从我的背景中获得正确的结果工作

2 个答案:

答案 0 :(得分:1)

听起来像设计问题。虽然您可以绕过它,但您应该考虑避免使用“永久”背景上下文。我通常建议每个操作站起来一个上下文(NSOperations可以很好地工作),然后在完成一个工作时扔掉它们。这样就不需要保持多个上下文同步,因为您只需要更新主上下文。

为什么您认为自己需要永久性的背景环境?如果原因是性能你有分析吗?

答案 1 :(得分:0)

您可以为包含您收到的所有NSSet的两种情境创建NSNotifications。每当你得到另一个时,只需在调用mergeChangesFromContextDidSaveNotification之前检查它们。想想看,将上一个存储在任何一个上下文中就足够了......