2017-10-06 70 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導致重試當沒有達到最大嘗試次數時。每次嘗試都會延遲重試的時間。當達到最大嘗試次數時,它會發出一個錯誤並完成主序列的錯誤。