在显示视图之前不更新数据SwiftUI

在显示视图之前不更新数据SwiftUI,swiftui,Swiftui,这是一个按钮,我在这里调用我的加载数据函数,并用我的数据显示新视图,这些数据应该在单击按钮时加载 Button(recentModel.dateTime) { loadData(dT: recentModel.dateTime) { self.showingView.toggle() } }.font(.custom("Gill Sans", siz

这是一个按钮,我在这里调用我的加载数据函数,并用我的数据显示新视图,这些数据应该在单击按钮时加载

Button(recentModel.dateTime) {
                loadData(dT: recentModel.dateTime) {
                    self.showingView.toggle()
                }
            }.font(.custom("Gill Sans", size: 12)).padding(.vertical, 1).sheet(isPresented: $showingView)
            {
                    View(lPSelections: lP, tSelections: t, mSelections: m, b: Title)
            }
这是我的加载数据函数。我不确定我需要做什么来修复这个问题,但基本上我在这里加载的数据需要传递给我在该按钮上调用的视图,单击。。。然而,每次我加载视图时,数据都是空的

func loadData(dT : String, finished: () -> Void) {
    let urlString = "https://myurl" + dT
    
    guard let url = URL(string: urlString) else {
        return
    }
    
    let task = URLSession.shared.dataTask(with: url, completionHandler: {
        data, _, error in
        
        guard let data = data, error == nil else {
            return
        }
        
        var result: Simulation?
        do {
            result = try JSONDecoder().decode(Simulation.self, from: data)
        }
        catch {
            print("Failed : \(error)")
        }
        
        guard let final = result else {
            return
        }
        
        let t = f
        
        for ts in t {
            lP.append(ts.lP!)
            m.append(ts.m!)
            t.append(ts.t!)
        }
        
        print("--------------------------------------------------")
        print(lP)
        
        
    })
    
    finished()

    task.resume()
    
    
}
最后,我打印了lP,这样我就知道数据正在加载,只是在视图加载和显示完成之后才加载


提前感谢。

您需要从完成处理程序内部调用
finished()
,否则,它将在URL数据任务运行/完成之前被调用

func loadData(dT : String, finished: @escaping () -> Void) { //<-- Here
    let urlString = "https://myurl" + dT
    
    guard let url = URL(string: urlString) else {
        return
    }
    
    let task = URLSession.shared.dataTask(with: url, completionHandler: {
        data, _, error in
        
        guard let data = data, error == nil else {
            return
        }
        
        //etc -- code omitted for brevity
        
        finished() //<-- Here
    })

    task.resume()
}

func-loadData(dT:String,finished:@escaping()->Void){//您需要在url完成处理程序中调用finished()。您可以对此进行更多扩展吗?当我输出finished()时在url完成处理程序内部,它给了我一个错误。转义闭包捕获非转义参数“finished”添加了一个答案,其中包含有关如何对其进行注释以修复该错误的信息。这是SwiftUI。请学习使用发布者/观察者而不是完成处理程序。在UIKit和SwiftUI中,多个数组作为真相的来源非常重要气馁。@vadian你能给我看一下吗?