RxSwift ловит ошибки сети и достижимости - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь использовать метод retryOnBecomesReachable из файлов примеров RX на своем сетевом уровне

extension ObservableConvertibleType {
    func retryOnBecomesReachable(_ valueOnFailure:E, reachabilityService: ReachabilityService?) -> Observable<E> {
        return self.asObservable()
            .catchError { (e) -> Observable<E> in
                return reachabilityService.reachability
                    .skip(1)
                    .filter { $0.reachable }
                    .flatMap({ _ -> Observable<E> in
                        return Observable.error(e)
                    })
                    .startWith(valueOnFailure)
            }
            .retry()
    }
}

// My layer

request
    .flatMapLatest{ request  in
        provider.rx.request(request)
            .map{ User.self }
            .map{ RequestState.loaded($0) }
            .retryOnBecomesReachable(.error(.notConnectedToInternet), reachabilityService: reachabilityService)
            .catchError({ .just(.error($0)) })
            .startWith(.startLoading)
}

Без этого метода все работает великолепно.Все ошибки отлавливаются и возвращаются .just(.error($0)) последовательности.

При использовании этого метода функция повтора работает потрясающе.Но когда что-то происходит (отображение, декодирование или другая ошибка), я получаю .notConnectedToInternet.Я думаю причина в .startWith(valueOnFailure) методе.Я пытался переместить, удалить, изменить положение, но ничего не помогает.Я застрял.

Что мне нужно сделать, чтобы использовать функцию повтора и исправить ошибки?

1 Ответ

0 голосов
/ 05 апреля 2019

Я думаю, что в основном изменение .startWith(valueOnFailure) на startWith(e) может работать для вас.Другой вариант - проверить, является ли ошибка ошибкой достижимости для начала внутри блока catch.

например,

.catchError { e in 
   guard e == SomeError.notConnectedToInternet else {
       return .error(e)
   }

   ... rest of your code
...