Как повторить запрос после выполнения аутентификации? - PullRequest
0 голосов
/ 22 сентября 2019

Я изучаю Swift ´s Combine, создавая приложение, пытаясь решить реальные случаи использования.

Обычный случай, я выполняю запрос, и токен аутентификации истек.Я хотел бы обновить токен, если запрос завершается неудачно с 401.

Что-то вроде:

fetchData()
   .flatMap { data, response
      if response.statusCode == 401 {
         refreshToken()
            .fetchData()
      } else {
         Just(data)
      }
   }
   .keepDoingThings()

Имейте в виду, что это просто псевдокод.

У меня естьпопробовал несколько вещей действительно, но это беспорядок.:)

Как это можно сделать?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 сентября 2019

Вы можете использовать tryMap(), чтобы выдать Error до refreshToken, затем сделать retry.

fetchData()
   .tryMap { data, response in
      if response.statusCode == 401 {
         refreshToken()
            .fetchData()
         throw __MYERROR__.invalidServerResponse
      } else {
         return data
      }
   }
   .retry(3)
   .keepDoingThings()
0 голосов
/ 24 сентября 2019

Я попытался перенести свою версию RxSwift на Combine, но в последней отсутствуют некоторые ключевые операторы (retryWhen и flatMapFirst).Поэтому одним из решений является использование RxCombine и RxSwift в вашем проекте, чтобы вы могли использовать мое решение RxSwift в своем проекте.

Вот моя реализация: https://medium.com/@danielt1263/retrying-a-network-request-despite-having-an-invalid-token-b8b89340d29

RxCombine: https://github.com/freak4pc/RxCombine

RxSwift: https://github.com/ReactiveX/RxSwift

Я не ожидаю, что этот ответ будетпринимается как правильный, но это может быть обходной путь до тех пор, пока в Combine не будут добавлены необходимые операторы.

...