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

iCa*_*ode 35 xcode core-data nsfetchedresultscontroller ios ios10

我将我的项目升级到Xcode 8.现在,我正在使用Xcode 8和iOS 10组合获取此错误日志.

在下面的代码中将cacheName设置为nil似乎可以解决它.

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:NULL cacheName:@"myCache"];
Run Code Online (Sandbox Code Playgroud)

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

Don*_*nit 26

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

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

对于已经在升级到iOS 10的设备上进行生产(使用xcode 7构建)的应用程序,也会出现此问题.

临时解决方案是使用nil作为cacheName禁用NSFetchedResultsController缓存:

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:NULL cacheName:nil];
Run Code Online (Sandbox Code Playgroud)

显然,通过这种方式我们无法获得缓存的优势.我希望Apple尽快解决这个问题.我打算测试10.2 beta 1.

OPEN RADAR 28361550

编辑 在iOS 10.2 beta 1上没有出现错误:它已经解决(暂时).

  • 我无法保证它是同一个问题,但我仍然在真实设备上看到iOS 10.2中的这个错误.从我的FRC中删除缓存解决了问题,所以我怀疑问题是相关的. (4认同)