异步过程完成后是否在SwiftUI中关闭.sheet?

异步过程完成后是否在SwiftUI中关闭.sheet?,swiftui,amazon-cognito,aws-amplify,Swiftui,Amazon Cognito,Aws Amplify,在调用异步进程以确认用户的MFA代码后,我试图在SwiftUI中关闭.sheet。(我在用电话) 我在主视图上设置了一个绑定变量,并在工作表显示的视图中引用它,该视图带有@binding var displayMFAView:Bool。我有一个跟踪用户状态的身份验证帮助程序:@EnvironmentObject var userAuthHelper:userAuthHelper 以下代码按预期关闭工作表: func confirmMFACode(verificationCode: String)

在调用异步进程以确认用户的MFA代码后,我试图在SwiftUI中关闭
.sheet
。(我在用电话)

我在主视图上设置了一个绑定变量,并在工作表显示的视图中引用它,该视图带有
@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的方法调用auth进程

这份工作表不会被驳回。我曾尝试在
DispatchQueue.main.async{…
中包装变量赋值,但这也没有解决问题

...
DispatchQueue.main.async {
    self.userAuthHelper.isSignedIn = true
    self.displayMFAView = false
}
...
事实上,这会在我的日志中添加以下内容:

不允许从后台线程发布更改;请确保在模型更新时从主线程(通过receive(on:)等操作符)发布值。

开关(…
包装在
DispatchQueue
per中,在日志中给了我相同的警告


诚然,我对SwiftUI或AWS Amplify没有很好的理解。我不明白什么?

从我可以看出,异步调用对状态变量做了一些意想不到的事情,但对EnvironmentObject没有。因此,我将
@Binding var displayMFAView:Bool
存储在EnvironmentObject中,

@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")
}
func verifyMFACode()
中,我可以进行异步调用以验证我的用户,然后切换工作表以在成功时消失:

func verifyMFACode(verificationCode: String) {
    AWSMobileClient.default().confirmSignIn(challengeResponse: verificationCode) {
    ...
    case .signedIn:
        self.settings.displayMFAView.toggle()
    ...

我看不到你所有的代码,但你可能会发现我的答案对…很有帮助,似乎那里也有类似的东西。
func verifyMFACode(verificationCode: String) {
    AWSMobileClient.default().confirmSignIn(challengeResponse: verificationCode) {
    ...
    case .signedIn:
        self.settings.displayMFAView.toggle()
    ...