Swift RX反馈示例问题 扩展URLSession{ fileprivate func loadRepositories(资源:URL)->可观察{ 回归自我 .rx.response(请求:url请求(url:资源)) .重试(3) .map(Repository.parse) .retryWhen{$0.delay(1.0,调度程序:MainScheduler.instance)} } }
为什么要在最后一步使用Swift RX反馈示例问题 扩展URLSession{ fileprivate func loadRepositories(资源:URL)->可观察{ 回归自我 .rx.response(请求:url请求(url:资源)) .重试(3) .map(Repository.parse) .retryWhen{$0.delay(1.0,调度程序:MainScheduler.instance)} } },swift,rx-swift,rx-cocoa,Swift,Rx Swift,Rx Cocoa,为什么要在最后一步使用retryWhen{$0.delay(1.0,scheduler:MainScheduler.instance)}?如果我不使用它会发生什么?如果Repository.parse返回错误,则代码示例中的retryWhen会将错误发出延迟1秒。在这种情况下,retryWhen运算符的使用有点误导,因为没有重试发生。它只是延迟了错误 RxFeedback的github页面上的示例代码已更新为新版本,该版本实际上会重试,直到达到最大尝试次数: extension URLSessi
retryWhen{$0.delay(1.0,scheduler:MainScheduler.instance)}
?如果我不使用它会发生什么?如果Repository.parse
返回错误,则代码示例中的retryWhen
会将错误发出延迟1秒。在这种情况下,retryWhen
运算符的使用有点误导,因为没有重试发生。它只是延迟了错误
RxFeedback的github页面上的示例代码已更新为新版本,该版本实际上会重试,直到达到最大尝试次数:
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) }
}
}
扩展URLSession{
fileprivate func loadRepositories(资源:URL)->可观察{
//在启动错误之前重试的最大尝试次数
设maxAttempts=4
回归自我
.rx
.response(请求:url请求(url:资源))
.重试(3)
.map(Repository.parse)
.retryWhen{errorTrigger in
返回errorTrigger.flatMapWithIndex{(错误,尝试)->在
如果尝试次数>=最大尝试次数-1{
返回可观察错误(error)
}
可观测回波
.timer(双精度(尝试+1),调度程序:MainScheduler.instance)
}
}
}
}
现在,当
Repository.parse
返回错误时,retryWhen
会在未达到最大尝试次数时导致重试。重试的延迟会随着每次尝试而变长。当达到最大尝试次数时,它会发出一个错误,并以一个错误完成主序列。欢迎使用SO。如果你在你的问题中加入更多的上下文,这将有助于人们回答。
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)
}
}
}
}