【发布时间】:2019-08-04 10:18:21
【问题描述】:
这段代码是对ScrollView 的一种压力测试。虽然包含 3000 个项目的 ForEach 循环渲染速度可以接受,但 30000 需要很长时间,并且 300000 永远(我在 3 分钟后停止)。
但是,在某些情况下,您需要滚动很多内容,想象一下具有可缩放比例(十年/年/月/日)的时间线。在这种情况下,可能有 50 年的天数要显示,用户必须有机会放大和缩小才能更改比例。
因此,我的问题是:SwiftUI 可以使用哪些策略来优化缓存、预取等,或者找出用户滚动后接下来要显示的部分,并防止模型计算宽度?
更准确地说:模型知道要显示的所有数据。 ScrollView 必须提供一个内容视图,该视图具有要显示的所有项目的宽度。这个宽度是我的问题:如何在没有所有项目可用的情况下以一种有意义的方式确定它?
struct TestScrollView: View {
var body: some View {
ScrollView(.horizontal, showsIndicators: true, content: {
HStack(alignment: .bottom, spacing: 1) {
// 3000 is working, 30000 not well, 300000 takes forever:
ForEach(1 ..< 30000) { index in
Rectangle()
.fill(Color.yellow)
.frame(minWidth: 100, idealWidth: 200, maxWidth: 300, minHeight: 500, idealHeight: 500, maxHeight: 500, alignment: .bottom)
}
}
})
}
}
``
【问题讨论】:
-
顺便说一句,在我的项目中,显示大约 2000 个项目的列表是可以的。但是,当我对项目应用过滤器时,例如,保留 1000 个项目,重新渲染列表需要花费大量时间,似乎计算每个单元格是否应该保留是耗时的。所以我认为现在甚至不适合使用 List 来显示这么多的项目,因为它的性能很差。
标签: swiftui