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