SwiftUI 可观察对象返回陈旧数据

Posted

技术标签:

【中文标题】SwiftUI 可观察对象返回陈旧数据【英文标题】:SwiftUI Observable Object returning stale data 【发布时间】:2020-05-04 05:06:44 【问题描述】:

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

【问题讨论】:

如果建议的解决方案对您不起作用,那么原因也在于其他一些未提供的代码。 【参考方案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

            
        

【讨论】:

以上是关于SwiftUI 可观察对象返回陈旧数据的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中使用可观察对象切换视图

如何在 SwiftUI 中使用可观察对象并与 NavigationLink 绑定?

如何将可观察对象发布的整数变量绑定到 SwiftUI 中的 textField?

SwiftUI - 从 Swift 类启动的可观察对象不会更新 ContentView() 上的 @ObservedObject

Combine + SwiftUI 中的最佳数据绑定实践?

SwiftUI-> 线程 1:致命错误:未找到 MyObject.Type 类型的可观察对象(工作表中的 EnvironmentObject)