我是个新手,希望有人能帮我. bearerToken函数更新用于getMedicalData()函数的idToken变量 问题是getMedicalData()函数在idToken的值被bearerToken()更新之前运行.这会导致getMedicalData()使用一个空的idToken变量. 如何同步它,以便getMedicalData()在运行完所有bearerToken()之后运行.

getMedicalData()bearerToken()的主要功能:

    func login(username: String, password: String) {
        _ = Amplify.Auth.signIn(
            username: username,
            password: password
        ) { [weak self] result in
            switch result {
            case .success(let signInResult):
                print(SignInResult.self)
                if signInResult.isSignedIn {
//calling the two functions
                    TokenManager.shared.bearerToken()
                    getMedicalData()

                    DispatchQueue.main.async {
                        self?.getCurrentAuthUser()
                    }
                }
                
            case .failure(let error):
                print("Login error:", error)
            }
        }
    }

bearerToken函数:

    func bearerToken() {
        _ = Amplify.Auth.fetchAuthSession { result in
            switch result {
            case .success(let session):
                if(session.isSignedIn) {
                    if let sess = session as? AWSAuthCognitoSession {
                        let result = sess.getCognitoTokens()
                        switch result {
                        case .success(let tokens):
                            self.idToken = String(tokens.idToken)
                            self.refreshToken = tokens.refreshToken
                        case .failure(let error):
                            print("Fetch user tokens failed with error \(error)")
                        }
                    }
                }
            case .failure(let error):
                print("Fetch session failed with error \(error)")
            }
        }
    }

推荐答案

你可以使用async-awaitcompletion handler.

在这里,您可以将其用作完成处理程序

func bearerToken(completion: @escaping () -> Void) {

        _ = Amplify.Auth.fetchAuthSession { result in
            switch result {
            case .success(let session):
                if(session.isSignedIn) {
                    if let sess = session as? AWSAuthCognitoSession {
                        let result = sess.getCognitoTokens()
                        switch result {
                        case .success(let tokens):
                            self.idToken = String(tokens.idToken)
                            self.refreshToken = tokens.refreshToken

                            completion()

                        case .failure(let error):
                            print("Fetch user tokens failed with error \(error)")
                        }
                    }
                }
            case .failure(let error):
                print("Fetch session failed with error \(error)")
            }
        }
    }

在你的Main function


       switch result {
            case .success(let signInResult):
                print(SignInResult.self)
                if signInResult.isSignedIn {
//calling the two functions
                    TokenManager.shared.bearerToken {

                        getMedicalData()

                        DispatchQueue.main.async {
                            self?.getCurrentAuthUser()
                        }
                    }
                }
                
       case .failure(let error):
                print("Login error:", error)
       }

Swift相关问答推荐

自定义完整屏幕封面动画

变量捕获:变量在函数闭包中的行为

阴影动画的动画不流畅

如何为任务扩展的泛型静态函数获得自动类型推理

NSWindow中以编程方式创建的TextField快捷方式与SwiftUI

如何在visionOS中定制悬停效果区域

如何把多个可观测性变成一个完备性?

通常从数组调用的SWIFT静态协议函数

从AppKit打开SwiftUI设置

是否在核心数据中使用Uint?

找出touch 点的屏幕亮度

为什么 SwiftUI 中 ForEach 的这个 Select 不起作用?

Pod lib lint 命令找不到 watchos 模拟器

用逻辑运算符保护让

如何在 Swift 中对单个单词进行词形还原

无法分配给属性:self 是不可变的,我知道如何修复但需要理解

在 Swift 中将计时器标签格式化为小时:分钟:秒

如何在 Swift 中将 NSURL 转换为字符串

在 Swift 中为 UIPickerView 设置默认值?

如何将 Int 拆分为其各个数字?