【问题标题】:(NSFetchedResultsController): couldn't read cache file to update store info timestamps(NSFetchedResultsController):无法读取缓存文件以更新存储信息时间戳
【发布时间】:2017-01-29 22:05:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您在模拟器上尝试此操作,那么,您可以通过转到模拟器 -> 重置内容和设置来尝试重置它。另外,清理项目。
  • 试过了。没有帮助:(
  • 升级到 Xcode 8 / iOS 10 后在真实设备上也看到了错误。
  • 升级后在真机上也看到了这个
  • 在上下文中调用 -save 时会弹出此错误。但我只从系统获得输出 - 从 save 方法返回的 NSError 仍然是 nil 所以它看起来只是一个警告。我还没有看到任何由它引起的异常行为,所以现在我可能就这样了。

标签: ios xcode core-data nsfetchedresultscontroller ios10


【解决方案1】:

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

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

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

一个临时解决方案是禁用 NSFetchedResultsController 缓存,并将 nil 作为 cacheName:

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

显然,通过这种方式我们无法利用缓存。 我希望苹果能尽快修复这个错误。我将针对 10.2 beta 1 进行测试。

OPEN RADAR 28361550

编辑 在 iOS 10.2 beta 1 上,该错误不会发生:它已被解决(目前)。

【讨论】:

  • 我不能保证这是同一个问题,但是我仍然在真实设备上的 iOS 10.2 中看到此错误。从我的 FRC 中删除缓存解决了这个问题,所以我怀疑这个问题是相关的。
【解决方案2】:

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

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

我使用的是NSFetchedResultsController。然后我回去添加状态恢复。然后在恢复时开始出现此错误。当我使用导航栏返回上一个视图控制器时,数据全部丢失/不正确。

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

重要

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

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

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

希望这会有所帮助。

【讨论】:

  • 你肯定有一个控制器:didChangeObject:atIndexPath:forChangeType:newIndexPath: 满足这个要求。
【解决方案3】:

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

希望苹果能解决这个问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多