【问题标题】:SwiftUI Observable Object returning stale dataSwiftUI 可观察对象返回陈旧数据
【发布时间】:2023-03-10 14:20:01
【问题描述】:

所以我对 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 行之前被调用,因此它将返回它设置的最后一个值。

【问题讨论】:

  • 如果建议的解决方案对您不起作用,那么原因也在于其他一些未提供的代码。

标签: ios swift swiftui


【解决方案1】:

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

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

            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 2018-04-11
    • 1970-01-01
    • 2017-07-12
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多