从子上下文更新时,NSFetchedResultsController不刷新

时间:2015-07-16 20:29:10

标签: ios objective-c core-data nsfetchedresultscontroller

我觉得我之前遇到过这个问题,并计划深入挖掘一些旧代码,但有没有人为此找到解决方案?

出于某种原因,这不会触发指向父上下文的 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 ......但没有区别。

任何想法都将不胜感激!

2 个答案:

答案 0 :(得分:4)

结果是获取结果控制器的怪癖。

NSFetchedResultsController 仅监视项目上的实际变量以进行更改,并且不监视所述目标上的关系目标或变量,无论这些目标或变量是否包含在传递给它的谓词中。我忘记了这个限制。

答案 1 :(得分:0)

在合并更改后,您是否尝试在上下文中调用-processPendingChanges? Apple的文档说明

  

直到控制器的托管对象上下文收到processPendingChanges消息后才会反映更改。

显然,这会在MacOS应用程序的事件循环结束时调用,但它不清楚或何时在iOS上调用。

另外,请确保您已在NSFetchedResultsControllerDelegate中实现了至少一种更改跟踪方法,否则您将无法跟踪对上下文的任何更改。再次来自Apple:

  

委托必须至少实施一种更改跟踪委托方法,才能启用更改跟踪。提供controllerDidChangeContent的空实现就足够了。