为什么我的数据没有返回到我的 UI,但它在 SwiftUI 中被很好地解码?

问题描述

我在 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
        } 
    }
}

解决方法

我对您的代码进行了一些快速更改(很晚了,抱歉)。一些评论:(1)你应该使用 try 吗? (带问号)您不需要捕获错误(永远不会生成),(2)为什么不使用可选的用户类型?,(3)您设置了“传出连接(客户端)”功能,不是吗?

struct ContentView: View {
    @State var didAppear = false
    @State var theUser: User? // = getNilUser()
    var body: some View {
        VStack{
            Text("Display name: \(theUser?.data.subreddit.display_name_prefixed ?? "No name found")")
            Text("Public description: \(theUser?.data.subreddit.public_description ?? "No description found")")
        }
        .frame(width:200,height: 200)
        .onAppear(perform: {
            getUser(withName: "markregg")
        })
    }
    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 {
                    if let decodedUser = try? JSONDecoder().decode(User.self,from: data) {
                        DispatchQueue.main.async {
                            self.theUser = decodedUser
                        }
                        return
                    }
                } else if let error = error {
                    print(error)
                } else {
                    print("Request failed")
                }
            }.resume()
            didAppear = true
        }
    }
}