Приостановка сетевого запроса при обновлении токенаIOS

Программируем под IOS
Ответить
Гость
 Приостановка сетевого запроса при обновлении токена

Сообщение Гость »


У меня есть класс Network Manager

класс NetworkService: NetworkRequestServicing { частный let tokenService: TokenServicing частный доступ httpClient: HTTPClient слабый делегат var: TokenDelegate? public init (httpClient: HTTPClient, tokenService: TokenServicing) { self.httpClient = httpClient self.tokenService = tokenService } func sendAuthenticatedRequest(запрос: Request, Модель ответа: T.Type, isFormData: Бул, время повтора: Int, дополнительныеHeaders: [String: String]?) async -> Result { пусть результат = ждут httpClient.sendRequest(запрос: запрос, Модель ответа: Модель ответа, время повтора: время повтора, дополнительные заголовки: дополнительные заголовки, isFormData: isFormData) результат переключения { случай .успех: вернуть результат случай .failure(пусть ошибка): если случай RequestError.unauthorized = ошибка { возвращение ожидания обновления (запрос: запрос, модель ответа: модель ответа) } еще { вернуть .failure(ошибка) } } } обновление частной функции(запрос: Запрос, Модель ответа: T.Type, isFormData: Bool = ложь, sendBinaryRequest: ((Request) async -> Result)? = ноль) асинхронный -> Результат { print("Требуется новый токен обновления") Guard let expiryDate = tokenService.getRefreshExpiryDate(), expiryDate > .now else { print("RefreshToken недействителен") возвращение ждут .failure(reLogin()) } Guard tokenService.getRefreshToken() != ноль еще { print("Токен обновления недоступен -> Пользователь должен повторно войти в систему") возвращение ждут .failure(reLogin()) } пусть число повторов = 3 для неудачныхRefreshAttempts в 1...numberOfRetries { пусть результат = ждет tokenService.tokenRefresh() результат переключения { случай .успех: print("Обновить токены удалось") ожидайте sendRefreshToDelegates() если пусть sendBinaryRequest = sendBinaryRequest { вернуть ожидание sendBinaryRequest (запрос) } еще { return await httpClient.sendRequest(запрос: запрос, модель ответа: модель ответа, isFormData: isFormData) } случай .failure(пусть ошибка): print("\(failedRefreshAttempts). попытка обновления токенов не удалась из-за \(ошибка)") } пытаться? await Task.sleep(nano Seconds: 1_000_000_000) // 1 секунда } возвращение ждут .failure(reLogin()) } это работает нормально, но мне нужно приостановить любой другой запрос, который может прийти во время выполнения запроса на обновление, чтобы избежать многократного срабатывания токенов и сохранить ненужные сетевые вызовы.

Я пытался использовать DispatchSemaphore. но с асинхронным методом это не сработало, и с первого взгляда кажется, что он замедлит мои общие сетевые запросы, поскольку будет выполнять их по одному.

Я тоже пытался этого добиться, сохраняя запросы в массиве, но это было довольно сложно масштабировать. есть ли другое решение, которое можно использовать?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»