同步问题,发送Api调用之前未设置idToken

问题描述 投票:0回答:1

我是 Swift 新手,我希望有人可以帮助我。 bearerToken 函数更新用于 getMedicalData() 函数的 idToken 变量 问题是 getMedicalData() 函数在 idToken 的值被 bearerToken() 更新之前运行。这会导致 getMedicalData() 使用空的 idToken 变量。 我怎样才能同步它,以便在运行所有 bearerToken() 之后运行 getMedicalData() 。

我调用 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)")
            }
        }
    }
swift aws-amplify
1个回答
0
投票

您可以使用 async-await完成处理程序

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

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

在你的主要功能


       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)
       }
© www.soinside.com 2019 - 2024. All rights reserved.