我試圖在我的 SwiftUI 視圖中呼叫此函式的結果:
class GetMessages: ObservableObject {
let BASE_URL = "apicallurl.com"
@Published var messages = [Timestamp]()
func fetchMessages() {
guard let url = URL(string: BASE_URL) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard error == nil else {print(error!.localizedDescription); return }
let theData = try! JSONDecoder().decode([String: Timestamp].self, from: data!)
DispatchQueue.main.async {
self.messages = Array(theData.values)
}
}
.resume()
}
}
我正在使用以下列印陳述句測驗輸出onAppear:
struct HomeTab: View {
@StateObject var getMsgs = GetMessages()
var body: some View {
NavigationView {
VStack(spacing: 0) {
greeting.edgesIgnoringSafeArea(.top)
messages
Spacer()
}
.onAppear {
print(getMsgs.fetchMessages())
print(getMsgs.messages)
}
}.navigationBarHidden(true)
}
兩個列印陳述句都列印()或[]
但是當我print(self.messages)在GetMessages課堂上列印時,資料列印得很好。
為什么在我Hometab看來它是空的?
uj5u.com熱心網友回復:
使用getMsgs.fetchMessages()時可能需要一些時間才能獲取結果。一旦結果可用messages,getMsgsinHomeTab將被更新,這將觸發視圖重繪 ,因為它是一個@StateObject并且被視圖“監控”。
但是,您不應該print(getMsgs.messages)在結果可用之前嘗試。
所以試試下面的示例代碼:
struct HomeTab: View {
@StateObject var getMsgs = GetMessages()
var body: some View {
NavigationView {
List {
ForEach(getMsgs.messages, id: \.self) { msg in
Text("\(msg)")
}
}
.onAppear {
getMsgs.fetchMessages()
// no printing of getMsgs.messages here
}
}.navigationBarHidden(true)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/448204.html
上一篇:屬性重定義擴展Swift
