2017-10-06 160 views
-1
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) }?如果我不使用它会发生什么?RxFeedback示例问题

+0

欢迎来到SO。如果你为你的问题添加更多的上下文,它会帮助人们回答。 –

回答

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导致重试当没有达到最大尝试次数时。每次尝试都会延迟重试的时间。当达到最大尝试次数时,它会发出一个错误并完成主序列的错误。