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) }
?如果我不使用它会发生什么?
答案 0 :(得分:0)
如果Repository.parse
返回错误,则代码示例中的retryWhen
会将错误发射延迟1秒。恕我直言,在这种情况下使用retryWhen
运算符有点误导,因为没有重试发生。它只会延误错误。
RxFeedback的github页面上的示例代码已更新为实际重试的新版本,直到达到最大尝试次数:
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
会在未达到最大尝试次数时导致重试。重试有一个延迟,每次尝试都会变得更长。当达到最大尝试次数时,它会发出错误并以错误结束主序列。