Вот статья со ссылкой на код, который должен вам помочь: https://medium.com/@danielt1263/retrying-a-network-request-despite-having-an-invalid-token-b8b89340d29
В результате вам нужно создать службу получения токена, которая будет удерживать текущий токен и вставляться в сеть.Цепочка вызовов для обновления токена при необходимости ...
Он будет использоваться следующим образом:
func getData<T>(response: @escaping Response, tokenAcquisitionService: TokenAcquisitionService<T>, request: @escaping (T) throws -> URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)> {
return Observable
.deferred { tokenAcquisitionService.token.take(1) } // gets the current token
.map { try request($0) } // creates the request using the current token
.flatMap { response($0) } // gets response from server
.map { response in
guard response.response.statusCode != 401 else { throw TokenAcquisitionError.unauthorized }
return response
}
.retryWhen { $0.renewToken(with: tokenAcquisitionService) }
}
Служба tokenAcquisitionService принимает .unauthorized ошибки и пытается получить новый токен с сервера.,Если он успешен, он попытается повторить цепочку.
Обратите внимание, что эта служба разработана для правильной работы, даже если у вас есть несколько запросов в полете одновременно, и она включает в себя тестовую систему, доказывающую, что она работает.