我为 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 秒后 - 将颜色更改为绿色 在这里我们可以看到,第二部分是重新创建的
您的 Section 标识符是整个 section 对象的哈希值。它是其所有属性的哈希值,包括项目数组。如果这些属性中的任何一个更改了哈希值,则会导致该部分重新加载。
因此对于 diffable 数据源来说,它看起来像是一个全新的部分!所以它破坏了旧的并添加了新的。您应该使用的只是该部分的 id - 在您的情况下是名称。因此,它只会更新新的单个项目。
这个想法也适用于物品。在你的情况下,它们很简单
Int
- 所以这不是问题。
但是如果你有一个符合 hashable 的结构——当其中一个结构属性发生变化时,整个单元将被销毁并重新加载。相反,您只想将项目的 ID 传递给数据源。通过观察数据中的值手动更新单元格中的视图。这样,只有在数据源中添加或删除全新模型时,才会销毁单元格。
中进行了解释