为什么我的函数返回一个空数组?

Why is my function returning an empty array?

我正在尝试在我的 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:

中使用 print 语句测试输出
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)
}

两个打印语句打印 ()[] 但是当我在 GetMessages class 中打印 print(self.messages) 时,数据打印正常。

为什么在我的 Hometab 视图中它是空的?

当您使用 getMsgs.fetchMessages() 时,获取结果可能需要一些时间。一旦结果可用 HomeTabgetMsgsmessages 将被更新,这将触发视图刷新, 因为它是一个 @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)
    }
}