swift - 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 传递Binding
给DetailView
.
现在DetailView
已TextFields
附加到Item
的属性。
当DetailView
更改 anItem
的属性时,它会导致List
刷新所有我不想要的项目。
此外,当这些属性之一发生更改时,主视图会更新仍然很重要,因为在 macOS 上,即使单击其中一项,主视图仍然可见。
我的问题是如何做到这一点,以便每当Item
从List
更改中传入时,只更新该行?
我还尝试了在我使用 a 的地方提到的解决方案LazyVStack
,它解决了性能问题,但我使用了List
a 的内部NavigationView
,并且LazyVStack
似乎不支持这一点。
非常感谢任何建议。
解决方案
.id(UUID())
从列表中删除。
默认情况下,List diffs 更改并仅更新受影响的行。对于非常大的数据集,该.id(UUID())
技巧用于强制整个列表在发生变化时重新加载,这可能比尝试区分大型数据集更快。听起来你不需要它,所以不必要地包含它实际上更糟糕。
编辑:我不认为通过索引绑定到数组是问题,但它是不寻常的,最终可能会咬你。
推荐阅读
- html - 如何使输入(收音机?)看起来像两个选择之间的切换/滑块?
- python - 同一程序上的 Pynput 鼠标和键盘
- react-native - React Native Dimensions 不适用于旋转
- html - 如何解决jquery错误
- c++-cli - 尝试将 SerialPort 输入打印到控制台
- python - 在命令行“ModuleNotFoundError: No module named 'asyncio.base_events'”中运行 django-admin 时出错
- assembly - 如何将 eax 寄存器中的值 ah 和 al 移动 2 个字节?x86 组装
- javascript - 如何转换 UTF8 Base64 字符串(电子邮件标头)?
- java - 我怎样才能通过 Intent 转移到 nex Activity
- php - 在 WooCommerce“收到订单”谢谢页面上获取订单 ID