uikit - 如何使用 UICollectionViewDiffableDataSource 对更新的项目进行建模

标签 uikit uicollectionviewdiffabledatasource

我很难理解如何使用 UICollectionViewDiffableDataSourceNSDiffableDataSourceSnapshot对项目的更改进行建模。

假设我有一个简单的项目,如下所示:

struct Item {
    var id: Int
    var name: String
}

根据通用参数的名称,UICollectionViewDiffableDataSourceNSDiffableDataSourceSnapshot不应与 Item 一起运行本身,但仅带有标识符,即 Int在这个例子中。

另一方面,同样基于通用参数的名称,UICollectionView.CellRegistration应该在完整的 Item 上运行的。所以我的猜测是UICollectionViewDiffableDataSource.CellProvider负责查找完整Item's通过 ID。不幸的是,因为除了快照之外,我还需要维护单独的项目存储。并且存在此存储可能与快照不同步的风险。

但我还是不清楚如何通知UICollectionViewDiffableDataSource某些项目更改了其 name不改变其 id 。我要 UICollectionView更新相关单元格并以动画方式更改内容大小,但我不想要插入或删除动画。

最佳答案

有两种方法可以解决您在这种情况下的问题。

  1. 首先是使您的 Item 模型符合可哈希协议(protocol)。这将允许您使用整个模型作为标识符,并且单元提供程序闭包将向您传递一个Item类型的对象。 UICollectionViewDiffableDataSource 将使用模型的每个实例的哈希值(这将同时考虑 idname 属性,从而解决您的名称更改问题)来识别单元格的数据。这比尝试欺骗 Collection View 数据源仅将 id 视为标识符要好,因为正如您所说,模型的其他方面可能会发生变化。结构的全部要点是充当值类型,其中所有模型属性的组合决定其“值”...无需欺骗 Collection View 数据源仅查看 Item.id.

  2. 按照您所说的操作,创建一个单独的字典,您可以在其中根据 ID 检索 Item。虽然维护字典的工作量稍微多一些,但就代码行数而言,这是相当微不足道的差异。您应该做的就是每次应用新快照时转储并重新计算字典。在这种情况下,要在模型更改时更新单元格,请确保交换字典中的模型并在快照上调用 reloadItem

虽然第二个选项通常是我的首选,因为可区分数据源的目的是允许通过仅涉及每个项目的简单标识符的数据源来处理大量数据集,在这种情况下,您的模型是这样简单地说,实际上并不担心计算哈希值等会浪费计算时间。如果您认为您的模型可能会随着时间的推移而增长,我可能会采用字典方法。

关于uikit - 如何使用 UICollectionViewDiffableDataSource 对更新的项目进行建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72092586/

相关文章:

ios - UIContentSizeCategory不符合Comparable?

uikit - 如何覆盖 iOS 9 虚拟键盘上的扩展键盘工具栏?

ios - 如何在可区分数据源中使用多个数据模型?

ios - UICollectionViewCompositionalLayout 不能使用与 UICollectionViewDiffableDataSource 相同的部分吗?

ios - UICollectionViewDiffableDataSource 正在替换数据而不是更新

ios - 快速初始化 View 数组的最佳方法?

iphone - 是否可以阻止 UISearchBar 在 UITableView 中滚动?

ios - 为什么 UICollectionViewDiffableDataSource 在没有任何变化的情况下重新加载每个单元格?

iOS - UITableView 索引 : Is there a way to highlight the selected alphabet?