如何在SwiftUI中将数据延迟加载到表单/列表?

如何在SwiftUI中将数据延迟加载到表单/列表?,swiftui,Swiftui,我在ForEach循环中生成文本,并使用一个表单来给出一个样式,尽管它在大量数据中不起作用,但我试图在sow how中使用LazyVStack,但我没有成功!如何将数据加载到包含大量数据的表单中 PS:同样的代码在ForEach上运行良好,没有使用表单或列表,甚至在LazyVStack的帮助下使用了更重的数据。我只想让代码使用表单或列表 struct ContentView: View { var body: some View { Form {

我在ForEach循环中生成文本,并使用一个表单来给出一个样式,尽管它在大量数据中不起作用,但我试图在sow how中使用LazyVStack,但我没有成功!如何将数据加载到包含大量数据的表单中

PS:同样的代码在ForEach上运行良好,没有使用表单或列表,甚至在LazyVStack的帮助下使用了更重的数据。我只想让代码使用表单或列表

    struct ContentView: View
{
    
    var body: some View
    {
    Form
    {
        ForEach(0 ..< 1000000) { index in
            Text("Row \(index)")
        }

    }

    
    }

}
struct ContentView:View
{
var body:一些观点
{
类型
{
ForEach(0..<1000000){index in
文本(“行\(索引)”)
}
}
}
}

您要查找的代码如下:

struct ContentView: View {
    var body: some View
    {
        Form
        {
            ForEach(0 ..< 100000, id: \.self) { index in
                Text("Row \(index)")
            }
        }
    }
}
struct ContentView:View{
var body:一些观点
{
类型
{
ForEach(0..<100000,id:\.self){中的索引
文本(“行\(索引)”)
}
}
}
}
你应该注意两件事:

首先,您应该给ForEach一个id以供使用,因为它不一定知道来自另一个项目的项目。这对于重新排序等非常重要

第二,我从你的指纹上掉了一个数量级。你要的是一张有一百万行的表格。对于渲染引擎来说,这仅仅是合理的。没有人会浏览一百万行。10万美元就可以了。同样的道理,没有人会浏览十万个项目


另一件你没有给出的是你的数据支持是什么。你的数据来自哪里?您应该限制每次显示的数据量,但这取决于源。例如,如果您使用的是核心数据,则可以限制来自存储的对象。您不应该显示超出用户可能使用的数据量。如果是,您还没有考虑到您要完成的任务。

问题是,静态数据源(以及所有内部依赖项)是一次分配的,即使稍后仅在需要时才显示相应的UI行

这里有一种可能的方法来解决这个问题——使数据容器动态化并按块加载数据(考虑到列表/表单重用行)

使用Xcode 12/iOS 14进行测试

struct ContentView: View {
    let max = 1000000 // even Int.max, if you want
    let block = 10

    @State private var indices = [0]   // << initially loaded small part

    var body: some View {
        List {
            ForEach(indices, id: \.self) { index in
                Text("Row \(index)")
                    .onAppear {

                        // load next block when last row shown (or can be 
                        // tuned to preload in avance)

                        if indices.last == index && index < max {
                            let next = max - index
                            indices.append(contentsOf:
                                Array(index + 1..<index+(next > block ? block : next)))
                        }
                    }
            }
        }
    }
}
struct ContentView:View{
如果需要,让max=1000000//偶数Int.max
设块=10

@State private var index=[0]//谢谢,但在我的问题中,这些都无关紧要,它们不是问题。这纯粹是一个理论问题。我无法想象在表单中加载100万行是一个有效的用例(从开发人员和用户体验的角度来看)。我建议你添加一个真实世界的示例,说明你想放在那里的数据。没错,这是理论性的,显然是理论性的,但谁在乎呢?它与LazyVStack一起工作,我只是喜欢使用表单样式,给我的文本添加样式。Show advanced是你的代码!哇!甚至比LazyVStack更好!我们中的一些人对此表示否定问题!你们的代码给我留下了深刻的印象!谢谢