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

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

在下面的代码中将cacheName设置为nil似乎可以修复它。

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

我该如何摆脱这个错误日志并在我的FRC中使用caching?

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

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

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

临时解决scheme是禁用NSFetchedResultsControllercaching与nil作为caching名称:

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

显然这样我们就无法获得caching的优势。 我希望苹果能尽快解决这个问题。 我要testing10.2 beta 1。

开放式雷达28361550

编辑在iOS 10.2 beta 1的错误不会发生:它已被解决(现在)。

我第一次在这里提供一个答案,但是这里…

我遇到了这个错误,并为我的个案find了解决办法。

我正在使用NSFetchedResultsController 。 然后我回去添加国家恢复。 这个错误,然后开始出现在恢复。 当我使用导航栏返回到先前的视图控制器时,数据全部丢失/不正确。

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

重要

委托人必须至less实现一个变更跟踪代理方法,才能启用更改跟踪。 提供controllerDidChangeContent(_:)的空实现就足够了。

我只是按照指示实施了一个空的controllerDidChangeContent(_:) 。 现在,一切正常,从问题的错误消息已经消失。 为了清楚起见,我简单地在每个视图控制器中用一个抓取结果控制器添加下面的代码:

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

希望这可以帮助。

在关注上述错误信息之后,我可以看到你的应用程序正在创build大量文件描述符,在caching文件夹中打开文件,并且永远不会closures或释放它们。 所以现在最好禁用NSFetchedResultsControllercaching。

希望苹果将解决这个问题