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未更新的原因?
答案 0 :(得分:9)
我在这里猜测一下,但是想想因为你在保存后立即重置上下文,因为重置,NSFetchedResultsController委托方法没有在这个上获取。我的意思是委托方法旨在处理当前结果集中更改的记录选择(插入,更新或删除当前由提取的结果控制器跟踪的记录)。
当您执行上下文重置时,您将所有这些都吹掉,因此这些委托方法不会被调用,因为它们跟踪的内容不再以它识别的形式存在。
每当我因传入iCloud更新而重置上下文时,我通常会确保为新重置的上下文重新创建我的获取结果控制器 。
强制退出应用程序将强制在重新启动时重新创建获取的结果控制器,从而显示您希望看到的数据。
答案 1 :(得分:0)
在应用程序启动时初始化您的托管对象上下文。然后与iCloud同步并重新加载表它将正常工作。当我遇到同样的问题时,我也做了同样的事情。