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)
                }
        }
    }
}