异步处理完成后,在SwiftUI中关闭.sheet吗?

时间:2019-12-14 01:38:12

标签: swiftui amazon-cognito aws-amplify

在调用异步过程以确认用户的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不太了解。我不明白什么?

1 个答案:

答案 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")
}