Цепные вызовы API - PullRequest
       0

Цепные вызовы API

0 голосов
/ 29 марта 2020

Я построил себе класс 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.

Вся эта цепочка мешает моему мозгу, и я надеялся, что кто-то сможет руководить меня здесь.

Большое спасибо !!!

1 Ответ

0 голосов
/ 29 марта 2020

Решение состоит в том, чтобы рекурсивно вызывать callEndPointX после завершения токена refre sh. Предположим, ваш запрос токена выглядит следующим образом:

func requestToken(completion:@escaping((String) -> Void))

затем

func callEndpointX(token: String, completion: @escaping(Result<User, APIError>) -> Void) {
       if tokenExpired() {
            requestToken(completion: { newToken in
                 callEndpointX(token: newToken, completion: completion)
            })
       }
       else {
          // your code for callendpointX
       }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...