SwiftUI列表更新缓慢



我有一个SwiftUI列表,它有数千个项目。每个项目都是这样的:

class Item: Codable, Identifiable {
var id = UUID()
var prop1 = ""
var prop2 = ""
}

现在我这样做:

List(store.items.indices, id: .self) { index in
DetailView(item: self.$store.items[index])
}.id(UUID())

我迭代indicies,因为我必须将Binding传递给DetailView

现在DetailView已经将TextFields附加到Item的属性。

DetailView更改Item的属性时,它会导致List刷新ALL项,这是我不希望的。

此外,当其中一个属性发生更改时,更新主视图仍然很重要,因为在macOS上,即使单击其中一个项目,主视图仍然可见。

我的问题是,如何使从List传入的Item发生更改时,只更新该行

我还尝试了一个提到的解决方案,其中我使用了LazyVStack,它解决了性能问题,但我在NavigationView中使用List,而LazyVStack似乎不支持这一点。

如有任何建议,我们将不胜感激。

从列表中删除.id(UUID())

默认情况下,List diffs会更改并仅更新受影响的行。对于非常大的数据集,.id(UUID())技巧用于在发生变化时强制重新加载整个列表,这可能比尝试区分大数据集更快。听起来你并不需要它,所以不必要地包含它实际上更糟糕。

编辑:我不认为通过索引绑定到数组是问题所在,但这很不寻常,最终可能会让你头疼。

只要不需要List特定的功能,就可以在ScrollView中使用LazyVStackList的效率还不如LazyVStack(苹果漏洞(。

ScrollView {
LazyVStack {
ForEach(store.items.indices) { index in
DetailView(item: self.$store.items[index])
}
}
}

最新更新