NSFetchedResultsController 错过了合并的 NSManagedObjectContext 的更新

Posted

技术标签:

【中文标题】NSFetchedResultsController 错过了合并的 NSManagedObjectContext 的更新【英文标题】:NSFetchedResultsController misses updates on merged NSManagedObjectContext 【发布时间】:2011-06-01 06:52:30 【问题描述】:

我有两个托管对象上下文,A 和 B。这两个上下文通过在保存时从一个到另一个合并更改来保持同步(通过监视 NSManagedObjectContextDidSaveNotification)。我已经验证对 A 和 B 的更改正在正确合并。

我有一个 NSFetchedResultsController 监控 B 的更新。我发现 A 的某些更新不会导致 B 上的 nsfrc 触发。当创建一个新的托管对象并将其添加到 A 时,具有 nsfrc 正在寻找的属性(在B上),nsfrc在B合并A保存的更改后触发。但是,如果A(和B)上已经存在托管对象,我修改对象并保存A,而我可以看到B正在合并从 A 的保存通知的更改,nsfrc 监控 B 不会触发。

我在这里缺少什么?

【问题讨论】:

让我澄清一下,NSFetchedResultsController 正在搜索的谓词是一个简单的布尔属性“marked == YES”。如果 nsfrc 正在监视托管对象上下文 A,它总是会触发这些更新。如果它正在监控 B,它只会看到添加到 A 的对象,而不是 A 中修改的对象。 谓词是针对B 实体还是A 实体运行的? 【参考方案1】:

我遇到了这个问题,看来我已经解决了。我不知道我到底做了什么。我的意思是我做了几件事,但不知道哪一个成为了解决方案。所以我就简单描述一下……

我已经重构了我的代码以遵循一些“提示”,这些提示可以在官方文档和一些论坛中找到:

    如果您在另一个线程中管理NSManagedObjectContext,它应该在该线程中创建,而不是以某种方式传递到那里。 您应该只在主线程中添加观察者(以获取保存通知以进行合并) - 这样它们也将在主线程中合并。 (可选,但我做到了)您可以尝试仅在主线程中保存上下文,即使它是在后台线程中创建和管理的。

1 & 3 看起来更像是一些“魔法”,所以我认为你应该先尝试遵循 2。希望这会对你有所帮助。

【讨论】:

我已经重构了我的代码,虽然这不是完整的答案,但线程问题似乎是根本原因。【参考方案2】:

不确定这是否能解决您的问题,但请在合并来自 A 的更改后,尝试在上下文 B 上调用 processPendingChanges

另外,您的 nsfrc 是否使用缓存?尝试禁用缓存,看看它是否对您的情况有任何影响...

【讨论】:

看看我的“解决方案”(如果可以这样称呼的话)——我的NSFetchedResultsController 使用缓存,现在没有问题。所以问题肯定不在于缓存。

以上是关于NSFetchedResultsController 错过了合并的 NSManagedObjectContext 的更新的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?