我很难理解如何使用 UICollectionViewDiffableDataSource
和NSDiffableDataSourceSnapshot
对项目的更改进行建模。
假设我有一个简单的项目,如下所示:
struct Item {
var id: Int
var name: String
}
根据通用参数的名称,UICollectionViewDiffableDataSource
和NSDiffableDataSourceSnapshot
不应与 Item
一起运行本身,但仅带有标识符,即 Int
在这个例子中。
另一方面,同样基于通用参数的名称,UICollectionView.CellRegistration
应该在完整的 Item
上运行的。所以我的猜测是UICollectionViewDiffableDataSource.CellProvider
负责查找完整Item's
通过 ID。不幸的是,因为除了快照之外,我还需要维护单独的项目存储。并且存在此存储可能与快照不同步的风险。
但我还是不清楚如何通知UICollectionViewDiffableDataSource
某些项目更改了其 name
不改变其 id
。我要 UICollectionView
更新相关单元格并以动画方式更改内容大小,但我不想要插入或删除动画。
最佳答案
有两种方法可以解决您在这种情况下的问题。
首先是使您的
Item
模型符合可哈希协议(protocol)。这将允许您使用整个模型作为标识符
,并且单元提供程序闭包将向您传递一个Item
类型的对象。UICollectionViewDiffableDataSource
将使用模型的每个实例的哈希值(这将同时考虑id
和name
属性,从而解决您的名称更改问题)来识别单元格的数据。这比尝试欺骗 Collection View 数据源仅将 id 视为标识符要好,因为正如您所说,模型的其他方面可能会发生变化。结构的全部要点是充当值类型,其中所有模型属性的组合决定其“值”...无需欺骗 Collection View 数据源仅查看Item.id
.按照您所说的操作,创建一个单独的字典,您可以在其中根据 ID 检索
Item
。虽然维护字典的工作量稍微多一些,但就代码行数而言,这是相当微不足道的差异。您应该做的就是每次应用新快照时转储并重新计算字典。在这种情况下,要在模型更改时更新单元格,请确保交换字典中的模型并在快照上调用reloadItem
。
虽然第二个选项通常是我的首选,因为可区分数据源的目的是允许通过仅涉及每个项目的简单标识符的数据源来处理大量数据集,在这种情况下,您的模型是这样简单地说,实际上并不担心计算哈希值等会浪费计算时间。如果您认为您的模型可能会随着时间的推移而增长,我可能会采用字典方法。
关于uikit - 如何使用 UICollectionViewDiffableDataSource 对更新的项目进行建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72092586/