在调用异步过程以确认用户的MFA代码后,我试图在SwiftUI中关闭.sheet
。 (我正在使用AWS Amplify Framework)。
我在主视图上设置了一个绑定变量,并在工作表以@Binding var displayMFAView: Bool
表示的视图中引用它。我有一个跟踪用户状态的身份验证帮助程序:@EnvironmentObject var userAuthHelper: UserAuthHelper
。
以下代码按预期解散了工作表:
func confirmMFACode(verificationCode: String) {
// Code to confifm MFA...
print("User confirmed MFA")
self.userAuthHelper.isSignedIn = true
self.displayMFAView = false
}
但是,如果我通过Amplify的confirmSignIn
方法调用身份验证过程,
func confirmVerificationMFA(verificationCode: String) {
AWSMobileClient.default().confirmSignIn(challengeResponse: verificationCode) { (signInResult, error) in
if let error = error as? AWSMobileClientError {
// ... error handling ...
} else if let signInResult = signInResult {
switch (signInResult.signInState) {
case .signedIn:
print("User confirmed MFA")
self.userAuthHelper.isSignedIn = true
self.displayMFAView = false
default:
print("\(signInResult.signInState.rawValue)")
}
}
}
}
工作表不会被解雇。我曾尝试将变量赋值包装在DispatchQueue.main.async {...
中,但这也没有解决问题。
...
DispatchQueue.main.async {
self.userAuthHelper.isSignedIn = true
self.displayMFAView = false
}
...
实际上,这将以下内容放入我的日志中:
不允许从后台线程发布更改;确保在模型更新时从主线程发布值(通过诸如receive(on :)之类的运算符)。
在https://stackoverflow.com/a/58288437/217101中将switch (...
换成DispatchQueue
,这给我同样的警告。
诚然,我对SwiftUI或AWS Amplify不太了解。我不明白什么?
答案 0 :(得分:0)
据我所知,异步调用对状态变量进行了某些意外操作,但对EnvironmentObject进行了某些操作。因此,我将Int
而不是let randomNumber = Int(arc4random_uniform(11)) + 1
存储在EnvironmentObject中,
@Binding var displayMFAView: Bool
,然后可以通过更新该对象中的布尔值来显示或隐藏displayMFAView
:
@EnvironmentObject var settings: UserSettings
@State var mfaCode: String = ""
在.sheet(...
中,我可以进行异步调用来验证我的用户,然后切换工作表以使其成功消失:
Button(action: {
self.signIn() // Async call happens here
self.settings.displayMFAView.toggle()
}) {
Text("Sign In")
}.sheet(isPresented: self.$settings.displayMFAView) {
// Example code to capture text
TextField("Enter your MFA code", text: self.$mfaCode)
}
Button(action: {
self.verifyMFACode(verificationCode: self.mfaCode) // async call
}) {
Text("Confirm")
}