[英]SwiftUI: Waiting for JSON to be decoded before
我在視圖中顯示反序列化的 JSON object 時遇到問題。 問題似乎是我的觀點是試圖從已發布的變量中解開一個值,然后再由獲得 JSON object 的 function 分配給它。
這是調用 api 的代碼
class ViewModel : ObservableObject {
@Published var posts : first?
init(subReddit : String){
fetch(sub: subReddit)
}
func fetch(sub : String) {
guard let url = URL(string: "https://www.reddit.com/r/" + sub + "/top.json?t=day") else {
return
}
let task = URLSession.shared.dataTask(with: url) { [weak self] data, _, error in
guard let data = data, error == nil else {return}
do{
let retVal = try JSONDecoder().decode(first.self, from:data)
DispatchQueue.main.async {
self?.posts = retVal
}
}
catch{
print(error)
}
}
task.resume()
}
}
這是我的觀點的代碼:
struct SubRedditView: View {
@StateObject var viewModel = ViewModel(subReddit: "all")
var body: some View {
NavigationView{
List{
ForEach((viewModel.posts?.data.children)!) {post in//at runtime I get a nil unwrap error here
Text(post.data.title)
Text(post.data.url_overridden_by_dest ?? "No Value")
}
}
.navigationTitle("Posts")
}
}
}
如果只有代表children
的 object 相關,則將發布的 object 聲明為該類型的空數組
@Published var posts = [TypeOfChildren]()
然后將孩子分配給數組
self?.posts = retVal.data.children
這使得視圖中的代碼更容易和安全。
ForEach(viewModel.posts) { post in
Text(post.title)
Text(post.url_overridden_by_dest ?? "No Value")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.