(在与下面的@AndreasOetjen 讨论后重写了这个问题。感谢他的评论。)
我遇到了使用UITableView
可区分数据源的问题。在我的应用程序中,当用户修改一个项目时,它可能会更改同一表格视图中显示的另一个项目。问题是,在我创建并应用包含两个项目的新值的新快照后,间接更改的项目的 UI 没有更新。
起初我认为 diffable 数据源能够检测到项目在不同快照中的值变化。例如,它可能以这种方式工作:如果它发现两个快照包含相同的项目(即两个快照中的项目具有相同的哈希值),它会比较它们的值并在值更改时更新表视图中该项目的行。然而,我后来意识到它可能不是那样工作的,因为 diffable 数据源没有定义任何 API 来获取和比较项目值(我最初的想法是它使用了description
计算属性和==
操作,但现在我认为它不是真的)。
所以我目前的理解是 diffable 数据源使用项目的哈希来检测项目顺序变化(即插入新项目,旧项目仍然存在等),而不是项目值变化(即旧项目仍然存在但它的值改变了)。如果这种理解是正确的,那么它就引出了一个问题:如何使用 diffable 数据源来实现以下场景?
- 一个项目有几个属性。一个属性(我们称之为属性 A)显示在 UI 中,但不用于生成哈希。
- 该项目存在于旧快照和新快照中,但其属性 A 发生了变化。所以它的 UI 需要更新。
在旧UITableView
API 中,这可以通过调用reloadRows()
或来实现reloadData()
。但是如何使用 diffable 数据源呢?
更新:
在花时间做实验并解决问题之后,我认为上述问题的理解是不正确的。请看下面我的回答。我相信这解释了可区分数据源的工作原理。我希望它对其他有同样困惑的人有所帮助。我很高兴被证明是错误的。真的。因此,如果您有不同的想法,请留下您的答案。