我是 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)")
}
}
}
您可以使用 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)
}