ios - 使用 NSFetchedResultsController 数据源实现 UITableViewDataSourcePrefetching

标签 ios swift core-data uikit

我有一个 UITableView,它从 NSFetchedResultsController 获取数据。为此,我基本上从 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html 复制了苹果的示例实现。 .

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

  • 我是否应该简单地创建一个字典,作为内存缓存,以保存预取数据并在 cellForRowAtIndexPath 中使用,而不是查询 fetchedResultsController.object(at: indexPath) 直接?
  • 据我所知,CoreData 已经自动缓存了获取的数据,所以也许我只需要在预取回调中调用 fetchedResultsController.object(at: indexPath),以确保数据被缓存?
  • 或者我根本不应该在使用获取的结果 Controller 时预取数据,因为我会绕过 Apple 提供的神奇集成?
  • 还是完全不同?

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

enter image description here

  • 异步获取请求?我认为它们不适用于 NSFetchedResultsController。我想这就是它直接在 managedObjectContext 上执行的原因?
  • 异步获取请求是根据在 NSFetchedResultsController 上调用 .performFetch() 的结果创建的。在我调用它之前什么都没有出现。但是由于调用后所有结果都在那里,我不明白为什么我需要再次预取它们。

最佳答案

如果您的模型有错误,它将提高性能。您的模型是否有错误取决于 iOS 优化,以及您如何创建架构和关系。

为了安全起见,您可以添加预取代码。我有 Swift 4 的代码。

func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
    let fetchRequest: NSFetchRequest<MyModel> = MyModel.fetchRequest()
    fetchRequest.returnsObjectsAsFaults = false
    let items = indexPaths.map { fetchedResultsController.object(at: $0) }
    fetchRequest.predicate = NSPredicate(format: "SELF IN %@", items)
    let asyncFetchRequest = NSAsynchronousFetchRequest(fetchRequest: fetchRequest)
    do {
        try fetchedResultsController.managedObjectContext.execute(asyncFetchRequest)
    } catch { }
}

它的作用不言自明。它在托管对象上下文上运行异步获取请求,从而解决故障(如果有)。

关于ios - 使用 NSFetchedResultsController 数据源实现 UITableViewDataSourcePrefetching,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44790957/

相关文章:

json - 在不删除小数的情况下在 Swift 中将 float 序列化为 JSON

iphone - iOS应用场景信用卡信息加密

ios - 使用 suiteName 检测 NSUserDefaults 中的更改

arrays - 结构数组 : How to save in coredata?

ios - (SWIFT 3) 创建父子托管对象上下文

objective-c - @interface DITableViewController (private) 是什么意思?

objective-c - 使用@synchronized 的正确方法是什么?

iphone - 在 iPhone 应用程序中捕获 60fps

ios - 如何居中混合变形 SCNNode 以查看

ios - 创建子实体并将属性向下移动实体层次结构