【发布时间】:2020-06-01 23:11:17
【问题描述】:
从 iOS 13 开始,使 UITableView 与 NSFetchedResultsController 保持同步的最简单方法似乎是使用快照。
每当 managedObjectContext 报告添加、删除或更新时,NSFetchedResultsController 都会向其委托提供快照引用。使用快照 (NSDiffableDataSourceSnapshot) 时,只需实现一种 FRC 委托方法:controller(_:didChangeContentWith:)。为了使该委托方法工作,UITableViewDiffableDataSource 和快照必须输入<String, NSManagedObjectID>。
它可以工作mostly。
但是如果需要更新整个表怎么办?使用 tableView.reloadData() 或 frc.performFetch() 似乎是反模式。
编辑
我手动构建了一个快照,并在必要时调用 apply。但是由于我的快照是基于 NSFetchedResultsSectionInfo 对象的,所以我似乎在复制 FRC 已有的内容:Hashable 部分标题和 Hashable NSManagedObjectIDs
【问题讨论】:
-
SmallTalk,我不明白你的问题: UITableView 和 NSFetchedResultsController 工作绝对完美。 (他们当然会这样做,否则许多主要应用程序会崩溃:-))我对您为什么还要使用快照感到困惑?为什么?是什么原因?你能帮我理解吗?
-
嗨 Fattie,谢谢支持。我的问题是:如果需要更新整个 UITableView,生成新的
NSDiffableDataSourceSnapshot的最佳做法是什么?我希望我能从 FRC 中“抓住它”。 FRC 现在可以提供 NSDiffableDataSourceSnapshotReference。但看来我必须通过自己的快照手动构建。由于我的快照是从 NSFetchedResultsSectionInfo 对象构建的,因此我似乎在复制 FRC 已有的内容:可散列的部分标题和可散列的 NSManagedObjectIDs -
我使用快照是因为我能够消除大约 6 个 FRC 委托方法,而只使用一个。正如 Apple 的“controller(_:didChangeContentWith:) 文档”所说:“如果实现了此方法,则不会调用其他委托方法。”所以 UITableViewDiffableDataSource+UITableView 超级性感,有漂亮的动画,并且消除了大量的样板代码。但我仍在试图理解为什么我必须“滚动我自己”的快照,如果 FRC 可以自己生成一个。
-
smalltalk @smallTalk,非常感谢您提供的信息 - 我将彻底调查您所说的一切!