首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用UITableViewDataSourcePrefetching数据源实现NSFetchedResultsController

用UITableViewDataSourcePrefetching数据源实现NSFetchedResultsController
EN

Stack Overflow用户
提问于 2017-06-27 22:32:13
回答 2查看 3.6K关注 0票数 7

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

现在,苹果在WWDC16上宣布了UITableViewDataSourcePrefetching协议,该协议提供回调,允许您预取数据,以便在需要表视图显示数据时已经加载数据。我正在寻找一个关于如何将其与NSFetchedResultsController集成的示例,因为我无法确定我是否正确地这样做。

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

*编辑*:我从WWDC16的核心数据讲座中找到了一张幻灯片,据说可以解释这一点,但我完全理解。

  • 异步取取请求?我以为他们不和NSFetchedResultsController一起工作。我想这就是它直接在managedObjectContext上执行的原因吧?
  • 异步获取请求是根据在.performFetch()上调用NSFetchedResultsController的结果创建的。除非我这么说否则什么都不会出现。但是,既然所有的结果都在调用它之后,我就不明白为什么我需要再次预取它们。
EN

回答 2

Stack Overflow用户

发布于 2018-09-26 03:11:21

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

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

代码语言:javascript
复制
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 { }
}

它所做的一切都是不言而喻的。它在托管对象上下文上运行异步获取请求,从而解决故障(如果有的话)。

票数 4
EN

Stack Overflow用户

发布于 2018-06-21 21:21:08

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

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

真正的问题是,如果您使用的FRC与批处理,预取的属性,等等,这真的为您购买任何东西,以侧面吗?我不太确定。我还没有注意到一个非常高调优的FRC+UITableView与vs之间有很大的区别,在大约1000个结果的表上没有预取。也可以通过触摸那些FRC会看到的对象(因为你共享相同的MOC),然后运行它的属性/关系预取,等等。我还没有看到很多关于这个机制的文档,但是如果苹果建议它,特别是使用FRC,我不得不认为它有帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44790957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档