我将我的项目升级到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
缓存。
希望苹果能解决这个问题