ios - LazyH & V 网格对大量数据是否有效?
问题描述
Apple 的文档说,对于 LazyVGrids 和 LazyHGrids,项目仅在需要时创建。它们在需要时被丢弃吗?我特别想知道它们是否是可用于生产的高性能 SwiftUI 版本的集合视图。谢谢你。
解决方案
它们是高性能的,尤其是与仅使用VStack
. 但是 - 单元格不会在以后被处理和重新创建,就像您在 UIKit 中可能知道的那样出列。延迟加载仅在第一次渲染行时有帮助,其中大多数不会。
您可以通过创建一个非常庞大的视图列表来测试这一点,每次创建视图时都会生成一个随机数:
struct ContentView: View {
var body: some View {
ScrollView {
LazyVStack {
ForEach(0 ..< 100000) { i in
ForEach(0 ..< 100) { j in
if j == 0 {
Text("SPACER: \(Int.random(in: 1 ... 100))")
} else {
Text("index: \(j) - \(i)")
}
}
}
}
}
}
}
生成这些随机数后,您可以看到它们在从顶部滚动到底部后不会刷新或更改。
此列表有 1000 万个项目,比您想要显示的数量级多。虽然运行速度有点慢,但它仍然处于可用的边缘。根据我的测试,当从上到下滚动时,这个示例使用了大约 400MB 的内存,远远超过了你想要使用的内存。
我认为LazyVStack
几乎适用于所有用例。无论如何,您通常都应该尝试限制项目的数量——因为如果需要,您始终可以创建一个分页系统,例如当您滚动到底部时自动加载更多视图。
这是一个压力测试,在实际用例中您不应该有这么多行。
推荐阅读
- c - 如何从 C 程序中使用 OCIServerVersion (Oracle)?
- r - 治疗前后测量的 Wilcox.test
- python - 如何将networkX图导入neo4j?
- apache-spark - 不允许 EMR Master SSH
- javascript - 通过某些表单验证来防止 ajax 调用
- php - PHP json_encode 既漂亮又非转义
- html - 在视频元素上叠加文本
- python - CSV to Feather in Pandas with slicing Rows
- c++ - sprintf 到空字符字符串时的预期行为
- mongodb - MongoDB子集合数据查询