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