首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用UICollectionViewDiffableDataSource对更新的项进行建模

如何使用UICollectionViewDiffableDataSource对更新的项进行建模
EN

Stack Overflow用户
提问于 2022-05-02 21:28:04
回答 1查看 134关注 0票数 0

我很难理解如何使用UICollectionViewDiffableDataSourceNSDiffableDataSourceSnapshot来建模项的更改。

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

代码语言:javascript
复制
struct Item {
    var id: Int
    var name: String
}

根据泛型参数的名称,UICollectionViewDiffableDataSourceNSDiffableDataSourceSnapshot不应该使用Item本身,而应该只使用标识符,在本例中是这样的Int

另一方面,同样基于泛型参数的名称,UICollectionView.CellRegistration应该对完整的Item进行操作。因此,我猜想UICollectionViewDiffableDataSource.CellProvider负责通过id找到完整的Item's。这很不幸,因为除了快照之外,我还需要保持一个单独的项目存储。而且,这种存储可能与快照不同步。

但我仍然不清楚该如何通知UICollectionViewDiffableDataSource,某些项目更改了其name而不更改其id。我希望UICollectionView更新相关的单元格和动画内容大小的变化,但我不想插入或删除动画。

EN

回答 1

Stack Overflow用户

发布于 2022-05-03 03:08:07

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

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

  1. 按您所说的做,创建一个单独的字典,在其中您可以根据它们的id检索Item。虽然维护字典的工作量稍大一些,但在代码行方面,这是一个相当微不足道的差别。每次应用新快照时,您应该做的就是转储和重新计算字典。在本例中,若要在模型更改时更新单元格,请确保在字典中交换模型并在快照上调用reloadItem .

虽然第二种选择通常是我的首选,因为不同数据源的要点是允许处理大量的数据集,只对每个项使用一个简单的标识符来处理数据源,在这种情况下,您的模型非常简单,因此对于计算哈希值的计算时间的浪费并不关心,等等。如果您认为您的模型可能会随着时间的推移而增长,我可能会采用字典方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72092586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档