DiffableDataSource 在更新数组后重新创建所有部分

问题描述 投票:0回答:1

我为 UICollectionViewDiffableDataSource 创建了一个结构

struct Section: Hashable {
   let name: String
   let items: [Int]
}

并使用此结构创建快照

func updateData(for data: [Section]) {
  var snapshot = NSDiffableDataSourceSnapshot<Section, Int>()
  snapshot.appendSections(data)
  for section in data {
    snapshot.appendItems(section.items, toSection: section.name)
  }
  dataSource.apply(snapshot, animatingDifferences: false)
}

这里是我如何设置初始数据

updateData(for: [Section(name: "T", items: [1, 2]), Section(name: "J", items: [3, 4, 5]))

如果我尝试使用此方法添加更多项目:

updateData(for: [Section(name: "T", items: [1, 2]), Section(name: "J", items: [3, 4, 5 ,6])])

重新创建了“J”部分 为什么会这样?

这里的例子是当单元格在加载 1 秒后 - 将颜色更改为绿色 在这里我们可以看到,第二部分是重新创建的

https://media.giphy.com/media/G3FEoQTarVN0NiYHTT/giphy.gif

ios swift uitableview uicollectionview diffabledatasource
1个回答
1
投票

您的 Section 标识符是整个 section 对象的哈希值。它是其所有属性的哈希值,包括项目数组。如果这些属性中的任何一个更改了哈希值,则会导致该部分重新加载。

因此对于 diffable 数据源来说,它看起来像是一个全新的部分!所以它破坏了旧的并添加了新的。您应该使用的只是该部分的 id - 在您的情况下是名称。因此,它只会更新新的单个项目。

这个想法也适用于物品。在你的情况下,它们很简单

Int
- 所以这不是问题。

但是如果你有一个符合 hashable 的结构——当其中一个结构属性发生变化时,整个单元将被销毁并重新加载。相反,您只想将项目的 ID 传递给数据源。通过观察数据中的值手动更新单元格中的视图。这样,只有在数据源中添加或删除全新模型时,才会销毁单元格。

这在docs中描述 并已在WWDC 21

中进行了解释
© www.soinside.com 2019 - 2024. All rights reserved.