【问题标题】:SwiftUI: Waiting for JSON to be decoded beforeSwiftUI:等待JSON被解码之前
【发布时间】:2022-01-02 19:48:58
【问题描述】:

我在视图中显示反序列化的 JSON 对象时遇到问题。问题似乎是我的观点是在获取 JSON 对象的函数将任何内容分配给它之前尝试从已发布变量中解开一个值。

这里是调用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")
    }
}
}

【问题讨论】:

  • 提供一个默认值。尽可能避免选项,如果你必须让它们寻找它们并提供填充物。每一个 ?和 !应该先进行某种检查。

标签: json swiftui


【解决方案1】:

如果只有代表children的对象是相关的,则将发布的对象声明为该类型的空数组

@Published var posts = [TypeOfChildren]()

然后将 children 赋值给数组

self?.posts = retVal.data.children

这使得视图中的代码更简单、更安全。

 ForEach(viewModel.posts) { post in
        Text(post.title)
        Text(post.url_overridden_by_dest ?? "No Value")

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    相关资源
    最近更新 更多