RxSwift捕获网络和可达性错误

时间:2019-04-04 12:54:54

标签: swift networking mapping rx-swift

我尝试在网络层的RX示例文件中使用retryOnBecomesReachable方法

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 :(得分:0)

我认为将.startWith(valueOnFailure)更改为startWith(e)可能对您有用。另一种选择是检查该错误是否是从catch块内部开始的可达性错误。

例如

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

   ... rest of your code