RxFeedback示例问题

时间:2017-10-06 11:47:06

标签: swift rx-swift rx-cocoa

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) }?如果我不使用它会发生什么?

1 个答案:

答案 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会在未达到最大尝试次数时导致重试。重试有一个延迟,每次尝试都会变得更长。当达到最大尝试次数时,它会发出错误并以错误结束主序列。