【问题标题】:iCloud and Core Data. NSFetchedResultsController doesn't update on initial synciCloud 和核心数据。 NSFetchedResultsController 不会在初始同步时更新
【发布时间】:2014-05-03 06:56:09
【问题描述】:

iCloud 和 Core Data 运行良好。 除了...

在初始应用启动时(现有的 iCloud 数据存在),NSFetchedResultsController 不会随着接收到的数据而更新。 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];
    }];

}


所以:我可以做些什么来开始查明为什么 NSFetchedResultsController 没有按应有的方式更新?

【问题讨论】:

  • 嗨,Jordan,您是否检查过 NSFetchedResultsController 是否没有收到更新,或者数据是否未存储在 coredata 中?在模拟器中,这非常容易跟踪 - 请查看 sqlite 文件。如果数据库可能为空:您是否总是对两者使用主上下文/相同的上下文?
  • @Lepidopteron 数据在那里,这可以通过重新加载表格视图来确认。我只使用一个上下文。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 好的,谢谢 Rob - 有没有一种简单的方法可以从我的单例数据存储控制器强制发生这种情况?否则,这意味着向我的所有表格视图控制器发送通知,这是可行的 - 但如果有更清洁(或更正确)的方式,那么我更喜欢那样。像 [managedObjectContext flushFetchedResultsControllers] 之类的东西?
    • 我不知道是否有更简单的方法,因为我只是触发通知而不是尝试搭载其他东西。然后在每个可能受影响的视图控制器中,我有一个简单的 handleReset 类型方法,该方法会在此通知上触发,以确保所有内容都正确刷新。对我来说,这可以最大限度地控制事件的顺序,但在实现方面确实非常简单。对我来说,通常不仅需要刷新获取的结果控制器,还需要刷新其他托管对象引用 - 这种方法使所有内容都包含在内且可预测。
    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2014-03-01
    • 2014-04-10
    相关资源
    最近更新 更多