使用 NSFetchedResultsController 数据源实现 UITableViewDataSourcePrefetching

car*_*ath 7 core-data uikit ios swift

我有一个 UITableView 可以从NSFetchedResultsController. 为此,我基本上从https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html复制了 Apples 示例实现。

现在在 WWDC16 上,Apple 宣布了该UITableViewDataSourcePrefetching协议,该协议提供了回调,让您可以预取数据,以便在需要由 tableview 显示时已经加载。我正在寻找有关如何将其与 集成的示例NSFetchedResultsController,因为我无法确定我是否正确执行此操作。

  • 我应该简单地创建一个字典作为内存缓存来保存预取数据并用于cellForRowAtIndexPath而不是fetchedResultsController.object(at: indexPath)直接查询吗?
  • 据我了解,CoreData 已经自动缓存获取的数据,所以也许我只需要调用fetchedResultsController.object(at: indexPath)预取回调,以确保数据被缓存?
  • 或者我不应该在使用获取的结果控制器时预取数据,因为我会解决 Apple 提供的神奇集成?
  • 或者完全是别的什么?

*编辑*:我在 WWDC16 上的 Core Data 演讲中找到了一张幻灯片,据说可以解释这一点,但我完全理解。

在此处输入图片说明

  • 异步获取请求?我以为他们不与NSFetchedResultsController. 我想这就是为什么它managedObjectContext直接执行?
  • 异步读取请求从调用的结果产生.performFetch()NSFetchedResultsController。在我打电话之前什么都没有出现。但是由于调用它后所有结果都在那里,我不明白为什么我需要再次预取它们。

Pro*_*in8 2

简而言之,您正在创建一个自定义谓词来“预热”MOC 中预测的特定对象。我认为,这个想法是表格视图告诉您更有针对性的滚动目标信息(基于速度等),关于它认为表格视图将结束的位置。这允许您执行异步请求来预取 MOC 中的这些对象,以便当您实际请求其属性时,它们已准备就绪。

这就是为什么您还完成了nil异步请求。您没有直接使用结果,因为您实际上可能尚未显示任何这些索引路径。Dictionary这也意味着当您获得预取的对象时,无需对结果进行额外的跟踪(例如在 a等中)。

真正的问题是,如果您使用具有批处理、预取属性等功能的 FRC,这真的会给您带来任何东西来回避它吗?我不太确定。我没有注意到UITableView在大约 1000 个结果的表上经过高度调整的 FRC+(带预取和不带预取)之间存在巨大差异。也可以仅通过触摸 FRC 就会看到的那些对象(因为您共享相同的 MOC),然后运行它的属性/关系预取等。我还没有看到关于此机制的太多文档,但是如果苹果建议这样做,特别是使用 FRC,我认为它会有所帮助。