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