首页 > 解决方案 > SwiftUI List 更新缓慢

问题描述

我有一个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因为我必须将 a 传递BindingDetailView.

现在DetailViewTextFields附加到Item的属性。

DetailView更改 anItem的属性时,它会导致List刷新所有我不想要的项目。

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

我的问题是如何做到这一点,以便每当ItemList更改中传入时,只更新该行?

我还尝试了在我使用 a 的地方提到的解决方案LazyVStack,它解决了性能问题,但我使用了Lista 的内部NavigationView,并且LazyVStack似乎不支持这一点。

非常感谢任何建议。

标签: swiftswiftui

解决方案


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

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

编辑:我不认为通过索引绑定到数组是问题,但它是不寻常的,最终可能会咬你。


推荐阅读