【发布时间】:2021-06-26 18:01:18
【问题描述】:
我在 here 之前已经发布过这个问题,并且我根据 this 文章对我的代码进行了一些更改,但现在我的数据甚至像以前一样在 .onAppear {…} 中不可用。基本上,我无法从 reddit API 中获取数据并将其存储在变量 theUser 中。
这是我的代码,感谢您抽出宝贵时间 :)
struct ContentView: View {
@State var didAppear = false
@State var theUser = getNilUser()
var body: some View {
VStack{
Text(theUser.data.subreddit.display_name_prefixed ?? "No name found")
Text(theUser.data.subreddit.public_description ?? "No description found")
}
.onAppear(perform: {
getUser(withName: "markregg")
print(theUser)
})
}
func getUser(withName username: String) {
if !didAppear {
guard let url = URL(string: "https://www.reddit.com/user/\(username)/about.json") else {
print("Whoops")
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
do {
if let decodedUser = try? JSONDecoder().decode(user.self, from: data) {
DispatchQueue.main.async {
self.theUser = decodedUser
}
return
}
} catch {
print(error)
}
} else if let error = error {
print(error)
} else {
print("Request failed")
}
}.resume()
didAppear = true
}
}
}
【问题讨论】:
-
什么时候叫
print(theUser)什么时候叫self.theUser = decodedUser?如果需要,请添加print。并替换print(theUser)`withprint("onAppear() theUser (theUser)")`,以免与您将在`self.theUser = decodedUser. Also, dont usetry?, you use ado/catch`中打印它的位置混淆,你没有错误吗? -
以上评论很重要。此外,在您链接到的最后一个问题中,回答者解释说网络调用是 异步 并且不会立即返回。在开始异步调用后,您仍在尝试
print,此时数据实际上还没有。一旦您确定您的 JSON 正确解码,请尝试在设置self.theUser后立即打印。我还建议将所有网络代码移动到单独的 ObservableObject 中。
标签: json swift swiftui jsondecoder