我有一个非常简单的视图,它有一个按钮,点击按钮我正在做一些 API 调用的事情。 API 调用后,我想在“if”块内采取一些操作,但它在第一次点击时不工作,但当我在按钮上点击两次或三次时它正在工作。我不知道为什么会这样。
查看
import SwiftUI
struct OtpView: View {
@ObservedObject var otpViewModel = OTPViewModel()
//@EnvironmentObject var session: SessionManager
var body: some View {
ZStack {
Button {
otpViewModel.fetchData()
if otpViewModel.isLoggedIn {
// some action
print("some action")
}
} label: {
Text("SUBMIT")
}
}
.navigationTitle("OTP")
}
}
struct OtpView_Previews: PreviewProvider {
static var previews: some View {
OtpView()
}
}
// 视图模型
import SwiftUI
import Foundation
class OTPViewModel: ObservableObject {
@Published var isLoggedIn: Bool = false
func fetchData() {
DispatchQueue.main.asyncAfter(deadline: .now() + 4, execute: {
self.isLoggedIn = true
})
}
}
关于“isLoggedIn”变量值的变化我想采取一些行动
因为
fetchData
在四秒后切换isLoggedIn
,第一次按下按钮时总是false
。
一个简单的解决方案是删除
if
表达式
if otpViewModel.isLoggedIn {
// some action
print("some action")
}
并将
onChange
修饰符添加到ZStack
ZStack {
// ...
}
.onChange(of: otpViewModel.isLoggedIn) { isLoggedIn in
if isLoggedIn {
// some action
print("some action")
}
}
你的意思是你想要在返回结果时在按钮中运行额外的代码。如前所述,您正在同步上下文中执行异步任务。一旦 otpViewModel.fetchData() 被调度运行,按钮将立即运行 if 语句(可能在后台更新到 isLoggedIn 之前)。
理想情况下,您需要运行的任何进一步逻辑都可以在异步函数返回并根据需要更新@Published变量后在对象的函数中完成。
然后视图将根据需要响应 @Published 变量更新。