Я построил себе класс APIService, который обрабатывает все взаимодействия с API, которые использует мое приложение
func callEndpointX(token: String, completion: @escaping(Result<User, APIError>) -> Void) {
guard let endpoint = URL(string: apiBaseUrl + "/endpointX") else {fatalError()}
var request = URLRequest(url: endpoint)
request.addValue("Bearer " + token, forHTTPHeaderField: "Authorization")
request.httpMethod = "GET"
let dataTask = URLSession.shared.dataTask(with: request) { data, response, error in
guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200, let jsonData = data
else { ... completion(.failure(.responseError)); return }
do {
let response = try JSONDecoder()...
completion(.success(response.detailresponse!))
} catch {
...
completion(.failure(.decodingError))
}
}
dataTask.resume()
}
Моя задача состоит в том, чтобы Несущий Токены Я передаю do истекает . Что я хотел бы сделать в случае истекшего токена, так это тихо обновить sh токен для пользователя перед нажатием на API. Итак, у меня есть мини-функция func tokenExpired() -> Bool {...}
, проверяющая, истек ли уже токен, и у меня есть доступ к другому API все refreshToken
аналогично func callEndpointX
выше.
То, что я борюсь с помощью этого метода можно связать их вместе, чтобы избежать условий гонки - т.е. когда вызывается func callEndpointX
, он должен проверить func tokenExpired()
и не продолжать какую-либо другую работу, пока это не будет сделано. Если срок действия истек, сначала он должен выполнить refreshToken
, и только после этого возвращение продолжится, и, наконец, будет выполнено повторение func callEndpointX
.
Вся эта цепочка мешает моему мозгу, и я надеялся, что кто-то сможет руководить меня здесь.
Большое спасибо !!!