繁体   English   中英

RxFeedback 示例问题

[英]RxFeedback Example issues

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) } 如果我不使用它会怎样?

如果Repository.parse返回错误,则代码示例中的retryWhen错误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会导致重试。 重试有一个延迟,每次尝试都会变得更长。 当达到最大尝试次数时,它会发出错误并以错误结束主序列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM