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 中使用可观察对象并与 NavigationLink 绑定?
如何将可观察对象发布的整数变量绑定到 SwiftUI 中的 textField?
SwiftUI - 从 Swift 类启动的可观察对象不会更新 ContentView() 上的 @ObservedObject
SwiftUI-> 线程 1:致命错误:未找到 MyObject.Type 类型的可观察对象(工作表中的 EnvironmentObject)