我有一个大约 50k 个项目的大阵列,其中每个项目都符合可识别的要求。
我不会以任何方式改变数组,例如重新排列或任何其他方式。
如果我将其直接传递给 ForEach,列表滚动性能会比传递索引时明显更加流畅。
我意识到文档中提到了与每个细胞的结构特性有关的事情,但我无法理解为什么会出现这种情况。
ForEach(myArray, id: \.id) { item in
MyRowView(item: item)
}
// Extremely choppy scroll
ForEach(myArray.indices, id: \.self) { index in
MyRowView(item: myArray[index])
}
简而言之,使用
ForEach(myArray, id: \.id)
SwiftUI 为每个项目赋予结构化身份——它知道数据是什么,并且可以有效地跟踪和重用视图。即使数组很大,也能实现平滑的滚动。相反,
ForEach(myArray.indices, id: \.self)
它只传递整数。SwiftUI 无法将这些索引与底层数据关联,因此可能会不必要地重新创建视图,从而导致性能不稳定。WWDC 2021 视频“Demystify SwiftUI”23:35详细解释了此行为