1

设置:

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

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

只要只在其中一种上下文中写入,这工作正常。在这种情况下,写在主要上下文上。但是,如果我在后台上下文中写入,则会导致无限循环。在后台上下文中保存会触发对主上下文的通知,主上下文依次合并更改并触发自己的通知,由后台上下文获取。这会触发后台上下文执行其后台作业,这些作业(如果他们写任何东西)再次开始循环。

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

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

4

2 回答 2

1

听起来像是设计问题。虽然您可能可以绕过它,但您应该考虑避免使用“永久”背景上下文。我通常建议为每个操作建立一个上下文(NSOperations 非常适合),然后在一项工作完成时将它们丢弃。这避免了保持多个上下文同步的需要,因为您只需要更新主上下文。

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

于 2010-07-28T23:36:07.753 回答
0

NSSet您可以为包含NSNotifications您收到的所有内容的两个上下文创建一个。每当您获得另一个时,只需在调用之前将其与那些进行核对即可mergeChangesFromContextDidSaveNotification。想想看,为任一上下文存储最后一个就足够了……</p>

于 2010-07-28T22:12:22.920 回答