我有一个从UITableView获取数据的NSFetchedResultsController。为此,我基本上从https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html复制了Apples示例实现。
现在,苹果在WWDC16上宣布了UITableViewDataSourcePrefetching协议,该协议提供回调,允许您预取数据,以便在需要表视图显示数据时已经加载数据。我正在寻找一个关于如何将其与NSFetchedResultsController集成的示例,因为我无法确定我是否正确地这样做。
cellForRowAtIndexPath中使用,而不是直接查询fetchedResultsController.object(at: indexPath)?fetchedResultsController.object(at: indexPath),以确保数据被缓存?*编辑*:我从WWDC16的核心数据讲座中找到了一张幻灯片,据说可以解释这一点,但我完全理解。

NSFetchedResultsController一起工作。我想这就是它直接在managedObjectContext上执行的原因吧?.performFetch()上调用NSFetchedResultsController的结果创建的。除非我这么说否则什么都不会出现。但是,既然所有的结果都在调用它之后,我就不明白为什么我需要再次预取它们。发布于 2018-09-26 03:11:21
如果您的模型有错误,它将提高性能。模型是否有错误取决于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 { }
}它所做的一切都是不言而喻的。它在托管对象上下文上运行异步获取请求,从而解决故障(如果有的话)。
发布于 2018-06-21 21:21:08
简而言之,您正在创建一个自定义谓词,以“温暖”MOC中预测的特定对象。我认为,这个想法是表视图告诉您更有针对性的滚动目标信息(基于速度等)。关于它认为表视图会在哪里结束。这允许您执行异步请求,以便在MOC中预取这些对象,以便当您实际请求其上的属性时,它们已经准备好了。
这就是为什么在异步请求上还有一个nil完成的原因。您没有直接使用结果,因为您可能还没有实际显示任何这些索引路径。这也意味着没有必要进行额外的跟踪(比如在Dictionary中,等等)。当你得到预取的对象时。
真正的问题是,如果您使用的FRC与批处理,预取的属性,等等,这真的为您购买任何东西,以侧面吗?我不太确定。我还没有注意到一个非常高调优的FRC+UITableView与vs之间有很大的区别,在大约1000个结果的表上没有预取。也可以通过触摸那些FRC会看到的对象(因为你共享相同的MOC),然后运行它的属性/关系预取,等等。我还没有看到很多关于这个机制的文档,但是如果苹果建议它,特别是使用FRC,我不得不认为它有帮助。
https://stackoverflow.com/questions/44790957
复制相似问题