我是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)
}}
}
答案 0 :(得分:1)
两件事
首先,@State
只能在View
中使用,而不能在ObservableObject
中使用。将@State
切换为@Published
。
第二,您的问题可能出在您的view
中。您好吗initializing the ObservableObject
(代码不可用)?它应该是@ObservedObject
,@EnvironmentObject
或@StateObject
。另外,请确保您没有创建两个不同的实例,singleton pattern或@EnvironemntObject
可以帮助您。