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 вызывает повторную попытку, когда максимальное количество попыток не было достигнуто. Повторная попытка имеет задержку, которая увеличивается с каждой попыткой. При достижении максимального количества попыток он выдает ошибку и завершает основную последовательность с ошибкой.

Другие вопросы по тегам