ios 更新数组后,DiffableDataSource重新创建所有节

z3yyvxxp  于 2022-12-15  发布在  iOS
关注(0)|答案(1)|浏览(170)

我为UI集合视图可区分数据源创建了一个结构

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

yqkkidmi

yqkkidmi1#

节标识符是节对象的哈希。它是其所有属性(包括项目数组)的哈希。如果这些属性中的任何一个更改,哈希更改将导致重新加载节。
对于diffable数据源,它看起来像一个全新的部分!因此它销毁旧的部分并添加新的部分。您应该使用的只是部分的id-在您的情况下是名称。在这种情况下,它只会更新新的单个项目。
这个想法也适用于物品。在你的例子中,它们很简单Int-所以这不是问题。
但是如果你有一个符合hashable的struct--当struct的一个属性改变时,整个单元格将被破坏并重新加载。相反,你只想将项的id传递给数据源,并通过观察数据中的值来更新单元格中的视图。这样,只有当一个全新的模型被添加到数据源或从数据源中删除时,单元格才会被破坏。
这在docs中进行了说明,并在WWDC 21中进行了解释

相关问题