У меня есть значение, которое выглядит следующим образом
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 headers
, если срок действия моего токена истек, я обновлю его, а затем верну новое значение.
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
, чтобы можно было продолжить его после запуска блока завершения.
Однако звонок не разрешается, и я не уверен, почему.