(NSFetchedResultsController):无法读取缓存文件以更新存储信息时间戳



我将我的项目升级到Xcode 8。现在,我得到这个错误日志与Xcode 8和iOS 10组合。

在下面的代码中设置cacheName为nil似乎可以解决这个问题。

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:NULL cacheName:@"myCache"];

我应该怎么做才能摆脱这个错误日志,并在我的FRC中使用缓存?

这个错误不应该被忽略,因为它可能导致应用程序崩溃。这与iOS 10文件描述符泄漏的错误有关。有关于openradar和Apple Bug Reporter的报告。

会发生什么:如果你加载一个视图控制器使用NSFetchedResultsController与一个非空的cacheName,每次你保存管理对象上下文你将打开一个或多个文件描述符指向fetchedResultsController的sectionInfo缓存文件。这意味着如果您保存上下文255次,您将达到可以在设备上打开的最大文件数量,并且不能打开任何新的资源,导致任何后续打开xib文件,图像,数据库等失败。

在升级到iOS 10的设备上已经在生产的应用程序(使用xcode 7构建)也会出现这个问题。

暂时的解决方案是禁用NSFetchedResultsController缓存与nil作为cacheName:

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:NULL cacheName:nil];

显然,这样我们就不能利用缓存了。我希望苹果能尽快修复这个bug。我要测试10.2 beta 1。

OPEN RADAR 28361550

编辑在iOS 10.2 beta 1中没有出现这个错误:它已经被解决了(目前)。

这是我第一次在这里给出答案,但是现在……

我遇到了这个错误,并为我的特殊情况找到了解决方案。

我使用的是NSFetchedResultsController。然后我返回添加State Restoration。然后在恢复时开始出现这个错误。当我使用导航栏返回到以前的视图控制器时,数据都丢失了/不正确。

在阅读NSFetchedResultsController文档时,我发现了以下内容:

重要

为了启用变更跟踪,委托必须实现至少一个变更跟踪委托方法。提供一个空的controllerDidChangeContent(_:)实现就足够了。

我只是按照指示实现了一个空的controllerDidChangeContent(_:)。现在,一切正常,问题的错误信息消失了。为了清楚起见,我只是在每个视图控制器中添加了以下代码:

// NSFetchedResultsController change tracking methods
    func controllerDidChangeContent(_ controller: 
NSFetchedResultsController<NSFetchRequestResult>) {
        // empty: see documentation
    }

仔细查看上述错误信息后,我发现您的应用程序正在创建大量的文件描述符,在缓存文件夹中打开文件,并且从未关闭或释放它们。所以现在最好禁用NSFetchedResultsController缓存。

希望苹果能解决这个问题

最新更新