我尝试在网络层的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)
方法中的原因。我试图移动,移除,更改位置,但没有任何帮助。我被卡住了。
我该怎么做才能使用重试功能并正确捕获错误?
答案 0 :(得分:0)
我认为将.startWith(valueOnFailure)
更改为startWith(e)
可能对您有用。另一种选择是检查该错误是否是从catch块内部开始的可达性错误。
例如
.catchError { e in
guard e == SomeError.notConnectedToInternet else {
return .error(e)
}
... rest of your code