SwiftUI-尝试从不同的视图重新运行类以强制重新加载数据

时间:2020-10-16 17:22:45

标签: swiftui

我是SwiftUI的新手,有时会为整个“声明式”概念而苦恼,但通常最终都可以实现……无论如何,我已经制作了一个简单的应用程序,可以从远程JSON文件中加载数据。那部分一切正常。 然后,我想在另一个视图上调用FetchData类-试图使它重新访问数据源并更新变量。看起来它运行的是ok类,因为在调用时会再次显示print语句-但变量不会使用新值更新。

此处提供了用于加载数据的类的代码。

    import SwiftUI


struct GetData: Hashable, Codable, Identifiable {
    var id: Int
    var CODE: String
    var RATE: Double
    var TIME: String
    var FLAG: String
    var COUNTRY: String
    var NAME: String
    
   
}



public class FetchData: ObservableObject {
 
  
  // 1.
   @Published var rates = [Rates]()
    @State var showingAlert = true
    
    init() {

        let url = URL(string: "https://www.exampledata.co.uk/example.php")!
        // 2.
        URLSession.shared.dataTask(with: url) { [self](data, response, error) in
            do {
                if let processData = data {
                    // 3.
                    let decodedData = try JSONDecoder().decode([Rates].self, from: processData)
                    DispatchQueue.main.async {
                       
                        self.rates = decodedData
                        print("Data Loaded from Internet")
                        self._showingAlert = State(initialValue: false)
                        
                    }
                } else {
                    print("No data")
                    self.rates=exchange
                    // use diferent method to load data from hardcopy if no internet avail
                    print("Data Loaded from Hardcopy")
                    self._showingAlert = State(initialValue: true)
                }
            } catch {
                print("Error")
                self.rates=exchange
                print("Data Loaded from Hardcopy")
                // use diferent method to load data from hardcopy if server down or general error
                self._showingAlert = State(initialValue: false)
            }
        }.resume()
    }
}

然后在另一个我想从中调用它的视图中...

        Text("Data last updated:" + RowData.TIME)
            .font(.footnote)
            .foregroundColor(Color.gray)
                Button(action: {
                    FetchData.init()

                }) {
                    HStack{
                    Image(systemName: "arrow.clockwise").resizable()
                        .frame(width: 15.0, height: 15.0)
                        Text("Reload rates")
                            .font(.footnote)
                    }}
        
    }

1 个答案:

答案 0 :(得分:1)

两件事

首先,@State只能在View中使用,而不能在ObservableObject中使用。将@State切换为@Published

第二,您的问题可能出在您的view中。您好吗initializing the ObservableObject(代码不可用)?它应该是@ObservedObject@EnvironmentObject@StateObject。另外,请确保您没有创建两个不同的实例,singleton pattern@EnvironemntObject可以帮助您。