首页 > 解决方案 > SwiftUI 可观察对象返回陈旧数据

问题描述

所以我对 SwiftUI 还是很陌生,我正在使用 Flask 的登录 API。我正在使用 ObservableObject,因为 BindableObject 已弃用。

class Auth: ObservableObject {
    let objectWillChange = ObservableObjectPublisher()

    var authenticated = false {
        willSet{
            objectWillChange.send()
        }
    }

    func verify(username : String, password : String){

        guard let url = URL(string: "MyAPIURL")
            else {return}

        let bodyFormat : [String:String] = ["Username":username,"Password":password]
        let body = try! JSONSerialization.data(withJSONObject: bodyFormat)

        var request = URLRequest(url:url)
        request.httpMethod = "POST"
        request.httpBody = body

        request.setValue("application/json", forHTTPHeaderField: "Content-Type")

        URLSession.shared.dataTask(with: request) {
            (data,response,error) in
            guard let data = data else {return}

            let decodedData = try! JSONDecoder().decode(UserLoginData.self, from: data)

            print(decodedData.Status)
            if(decodedData.Status == "Success"){
                DispatchQueue.main.async {
                    self.authenticated = true
                }
            }
            else{
                DispatchQueue.main.async {
                    self.authenticated = false
                }
            }
        }.resume()
    }
}

在主视图中,我有

@ObservedObject var authenticator = Auth()
self.authenticator.verify(username: self.username, password: self.password)
print(authenticator.authenticated) 

我正在打印它以检查值。现在的问题是,服务器将返回“成功”响应,但是当我这样做时,print(authenticator.authenticated)它会打印出旧数据。当我按两次登录按钮时,它会在获取先前分配的数据时起作用。

感谢您的任何帮助!!

编辑:我注意到的一件事是该print(authenticator.authenticated) 行在该行之前被调用authenticator.authenticated,因此它将返回它设置的最后一个值。

标签: iosswiftswiftui

解决方案


只需将您的打印件移至此处:

print(decodedData.Status)
        if(decodedData.Status == "Success"){
            DispatchQueue.main.async {
                self.authenticated = true
//-> print here
            }
        }
        else{
            DispatchQueue.main.async {
                self.authenticated = false
//-> print here

            }
        }

推荐阅读