首页 > 解决方案 > LazyH & V 网格对大量数据是否有效?

问题描述

Apple 的文档说,对于 LazyVGrids 和 LazyHGrids,项目仅在需要时创建。它们在需要时被丢弃吗?我特别想知道它们是否是可用于生产的高性能 SwiftUI 版本的集合视图。谢谢你。

标签: iosswiftswiftui

解决方案


它们是高性能的,尤其是与仅使用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几乎适用于所有用例。无论如何,您通常都应该尝试限制项目的数量——因为如果需要,您始终可以创建一个分页系统,例如当您滚动到底部时自动加载更多视图。

这是一个压力测试,在实际用例中您不应该有这么多行。


推荐阅读