2017-10-06 3 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) }を使用するのはなぜですか?私がそれを使わないとどうなりますか?Rxフィードバック例問題

+0

ようこそ。それはあなたの質問にもう少し文脈を加えれば、人々が答えるのを助けるでしょう。 –

答えて

0

Repository.parseがエラーを返す場合、コード例のretryWhenはエラーエミッションを1秒遅らせます。 IMHO 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が再試行を引き起こし試行の最大回数に達していない場合再試行には遅延があり、試行ごとに長くなります。最大試行回数に達すると、エラーが発生し、エラーが発生してメインシーケンスが終了します。