我有一个 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 演讲中找到一张幻灯片,据说可以解释这一点,但我完全理解。
- 异步获取请求?我认为它们不适用于
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/