我有一个看起来像这样的值
lazy var authHeaders: [String: String] = {
if shouldTokenBeRefreshed() {
let semaphore = DispatchSemaphore(value: 0)
refreshTokens {
semaphore.signal()
}
semaphore.wait()
}
return ["Authorization": "Bearer \(module.client.credential.oauthToken)"]
}()
想法是,当请求我的 auth header
时,如果我的 token 已过期,我将刷新它,然后返回新值。
func refreshTokens(completion: @escaping () -> Void) {
guard let token = keychain.get("refresh_token") else { return }
module.renewAccessToken(
withRefreshToken: token,
success: { [weak self] credential, response, parameters in
guard let self = self else { return }
self.storeTokens([
"access_token": credential.oauthToken,
"refresh_token": credential.oauthRefreshToken
])
completion()
},
failure: { error in
print(error.description)
})
}
由于这是一个async
操作,我尝试使用Semaphore
暂停流程,以便在触发完成 block 后让它继续。
但是通话没有解决,我不确定为什么。
最佳答案
这不是您使用 DispatchSemaphore
的方式。
请不要强制异步代码同步。
您将需要重构代码以更好地处理您要实现的目标的异步性质。
完成处理程序是更简单、更有效的方法。如果您出于某种原因试图避免这种情况,请查看 PromiseKit 或其他异步帮助程序库。
另一种建议不是在飞行前更新您的 token ,而是在 401 上更新它们,然后重放您的原始更新请求。
关于ios - 如何在闭包中使用 DispatchSemaphore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55870934/