为什么我的函数返回一个空数组?
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()
时,获取结果可能需要一些时间。一旦结果可用
HomeTab
中 getMsgs
的 messages
将被更新,这将触发视图刷新,
因为它是一个 @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)
}
}
我正在尝试在我的 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)
}
两个打印语句打印 ()
或 []
但是当我在 GetMessages
class 中打印 print(self.messages)
时,数据打印正常。
为什么在我的 Hometab
视图中它是空的?
当您使用 getMsgs.fetchMessages()
时,获取结果可能需要一些时间。一旦结果可用
HomeTab
中 getMsgs
的 messages
将被更新,这将触发视图刷新,
因为它是一个 @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)
}
}