/ / RxFeedback Exemples de problèmes - swift, rx-swift, rx-cacao

RxFeedback Exemples de problèmes - swift, rx-swift, rx-cocoa

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

Pourquoi devrais-je utiliser retryWhen { $0.delay(1.0, scheduler: MainScheduler.instance) } à la dernière étape? Que se passe-t-il si je ne l'utilise pas?

Réponses:

0 pour la réponse № 1

Si Repository.parse renvoie une erreur, le retryWhen dans votre exemple de code, l’émission d’erreur est retardée d’une seconde. IMHO l'utilisation de retryWhen l’opérateur est un peu trompeur dans ce cas, car il n’ya pas de nouvelle tentative. Cela ne fait que retarder l'erreur.

L’exemple de code de la page github de RxFeedback a été mis à jour vers une nouvelle version qui tente réellement jusqu’à atteindre le nombre maximal de tentatives:

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

Maintenant, quand Repository.parse renvoie une erreur, retryWhen provoque une nouvelle tentative lorsque le nombre maximal detentatives n'a pas été atteint. La nouvelle tentative a un délai qui s'allonge à chaque tentative. Lorsque le nombre maximal de tentatives est atteint, il génère une erreur et termine la séquence principale avec une erreur.