RxFeedback Пример проблем
extension URLSession {
fileprivate func loadRepositories(resource: URL) -> Observable<SearchRepositoriesResponse> {
return self
.rx.response(request: URLRequest(url: resource))
.retry(3)
.map(Repository.parse)
.retryWhen { $0.delay(1.0, scheduler: MainScheduler.instance) }
}
}
Почему я должен использовать retryWhen { $0.delay(1.0, scheduler: MainScheduler.instance) }
на последнем этапе? Что будет, если я им не пользуюсь?
1 ответ
Если Repository.parse
возвращает ошибку, retryWhen
в вашем примере кода задерживает излучение ошибки на 1 секунду. ИМХО применение retryWhen
В этом случае оператор немного вводит в заблуждение, поскольку повторных попыток не происходит. Это просто задерживает ошибку.
Пример кода на странице GitHub RxFeedback был обновлен до новой версии, которая фактически повторяет попытки до достижения максимального количества попыток:
extension URLSession {
fileprivate func loadRepositories(resource: URL) -> Observable<SearchRepositoriesResponse> {
// The maximum number of attempts to retry before launch the error
let maxAttempts = 4
return self
.rx
.response(request: URLRequest(url: resource))
.retry(3)
.map(Repository.parse)
.retryWhen { errorTrigger in
return errorTrigger.flatMapWithIndex { (error, attempt) -> Observable<Int> in
if attempt >= maxAttempts - 1 {
return Observable.error(error)
}
return Observable<Int>
.timer(Double(attempt + 1), scheduler: MainScheduler.instance).take(1)
}
}
}
}
Теперь, когда Repository.parse
возвращает ошибку, retryWhen
вызывает повторную попытку, когда максимальное количество попыток не было достигнуто. Повторная попытка имеет задержку, которая увеличивается с каждой попыткой. При достижении максимального количества попыток он выдает ошибку и завершает основную последовательность с ошибкой.