我觉得我之前遇到过这个问题,并计划深入挖掘一些旧代码,但有没有人为此找到解决方案?
出于某种原因,这不会触发指向父上下文的 NSFetchedResultsController 进行更新:
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note)
{
if ([[note object] isKindOfClass:[NSManagedObjectContext class]] && [[note object] parentContext])
{
NSManagedObjectContext *parentContext=[[note object] parentContext];
[parentContext performBlockAndWait:^
{
[parentContext mergeChangesFromContextDidSaveNotification:note];
} ];
}
} ];
基本上,如果我对子NSManagedObjectContext进行了一系列更改,然后保存该上下文,则会触发此操作。但是, NSFetchedResultsController 显示的数据来自先前的上下文合并。如果我退出应用程序并重新启动它,它会显示正确的数据。有点烦人,因为有些东西显然不见了,我记不起来了。
我试过这个:https://github.com/facebook/FBFetchedResultsController ......但没有区别。
任何想法都将不胜感激!
答案 0 :(得分:4)
结果是获取结果控制器的怪癖。
NSFetchedResultsController 仅监视项目上的实际变量以进行更改,并且不监视所述目标上的关系目标或变量,无论这些目标或变量是否包含在传递给它的谓词中。我忘记了这个限制。
答案 1 :(得分:0)
在合并更改后,您是否尝试在上下文中调用-processPendingChanges
? Apple的文档说明
直到控制器的托管对象上下文收到processPendingChanges消息后才会反映更改。
显然,这会在MacOS应用程序的事件循环结束时调用,但它不清楚或何时在iOS上调用。
另外,请确保您已在NSFetchedResultsControllerDelegate中实现了至少一种更改跟踪方法,否则您将无法跟踪对上下文的任何更改。再次来自Apple:
委托必须至少实施一种更改跟踪委托方法,才能启用更改跟踪。提供controllerDidChangeContent的空实现就足够了。