/ / Przykłady RxFeedback - swift, rx-swift, rx-cocoa

RxFeedback Problemy z przykładami - szybkie, rx-szybkie, rx-kakao

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) }
}
}

Dlaczego powinienem używać retryWhen { $0.delay(1.0, scheduler: MainScheduler.instance) } w ostatnim kroku? Co się stanie, jeśli go nie użyję?

Odpowiedzi:

0 dla odpowiedzi № 1

Gdyby Repository.parse zwraca błąd retryWhen w przykładzie kodu opóźnia emisję błędu o 1 sekundę. IMHO wykorzystanie retryWhen W tym przypadku operator jest nieco mylący, ponieważ nie ma ponownej próby. To tylko opóźnia błąd.

Przykładowy kod na stronie github RxFeedback został zaktualizowany do nowej wersji, która faktycznie wykonuje próby aż do osiągnięcia maksymalnej liczby prób:

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)
}
}
}
}

Teraz, kiedy Repository.parse zwraca błąd, retryWhen powoduje ponowienie próby, gdy maksymalna liczbapróby nie zostały osiągnięte. Próba ma opóźnienie, które staje się dłuższe przy każdej próbie. Po osiągnięciu maksymalnej liczby prób emituje błąd i kończy sekwencję główną z błędem.