iCloud和核心数据。 NSFetchedResultsController在初始同步时不会更新

时间:2014-03-25 12:22:01

标签: ios iphone objective-c ipad core-data

iCloud和核心数据运作良好。的除了...

在初始应用程序启动时(现有的iCloud数据存在),NSFetchedResultsControllers不会在接收到的数据通过时更新。 NSFetchedResultsController委托只是不被调用。在强制退出并重新启动应用程序时,所有数据都应该存在。

核心数据代码与优秀教程here相同。我觉得这个代码没有错,因为我已经将它用于另一个应用程序,并且没有这个问题。

其他信息:我的托管对象上下文是使用主队列并发进行初始化的。我唯一能想到的是,我可以捕获初始数据 - 在应用程序最初启动后几秒钟就会调用以下函数。但是,虽然数据通过,但现有的获取结果控制器似乎没有相应更新(但是再次创建它们会显示数据)。


- (void)storesWillChange:(NSNotification *)notification {
    NSManagedObjectContext *context = self.managedObjectContext;

    [context performBlockAndWait:^{
        NSError *error;

        if ([context hasChanges]) {
            BOOL success = [context save:&error];

            if (!success && error) {
                // perform error handling
                NSLog(@"%@",[error localizedDescription]);
            }
        }

        [context reset];
    }];

}


所以:我该怎么做才能开始查明NSFetchedResultsControllers未更新的原因?

2 个答案:

答案 0 :(得分:9)

我在这里猜测一下,但是想想因为你在保存后立即重置上下文,因为重置,NSFetchedResultsController委托方法没有在这个上获取。我的意思是委托方法旨在处理当前结果集中更改的记录选择(插入,更新或删除当前由提取的结果控制器跟踪的记录)。

当您执行上下文重置时,您将所有这些都吹掉,因此这些委托方法不会被调用,因为它们跟踪的内容不再以它识别的形式存在。

每当我因传入iCloud更新而重置上下文时,我通常会确保为新重置的上下文重新创建我的获取结果控制器

强制退出应用程序将强制在重新启动时重新创建获取的结果控制器,从而显示您希望看到的数据。

答案 1 :(得分:0)

在应用程序启动时初始化您的托管对象上下文。然后与iCloud同步并重新加载表它将正常工作。当我遇到同样的问题时,我也做了同样的事情。