Hi all!
I鈥檓 using Moya 10.0.1 (RxMoya, RxSwift -> 4.0) with basic settings and trying to retry failed request after some delay.
If I鈥檓 using rx timer inside retry handler it doesn鈥檛 work (retry handler called only once). If I returns Observable.just(1) inside retry handler it works but without any delay. Please see my sample code:
let maxAttempts = 5
let retryHandler: (Observable<Error>) -> Observable<Int> = { error in
return error.enumerated().flatMap { (attempt, error) -> Observable<Int> in
if attempt >= maxAttempts - 1 {
return Observable.error(error)
}
//this is not work. This block called but a second request does not occur
print("\nretrying request after \(attempt + 1) seconds \n")
return Observable<Int>.timer(Double(attempt + 1), scheduler: MainScheduler.instance).take(1)
// This works, but without any delays
//return Observable.just(1)
}
}
let provider = MoyaProvider<MoyaHomeService>()
provider.rx
.request(.getHomeData())
.filterSuccessfulStatusCodes()
.do(onError: { (error) in
//Here I receive error, do some actions
print(error)
})
.retryWhen(retryHandler)
.map(to: HomeModel.self)
.subscribe(onSuccess: { (model) in
print(model)
//success reqeust
}) { (error) in
//failed request
print(error)
}.disposed(by: bag)
Also this retry handler works properly with regular URLRequest. Any suggestions?
My first question for you is whether you're retaining your provider or not. If your provider is released, the request will be too.
Once you're sure you're retaining your provider we can move onto other potential issues 馃槃
The fact that an immediate (synchronous) retry works and one that waits a little doesn't makes me suspect that something you weren't expecting to have disposed of is being disposed.
@AndrewSB yeah, you are right! I didn't retain the provider. I searched the entire Internet in search of an answer and missed this little moment. my mistake... Now it works like a charm! Thank you for the help.
You鈥檙e welcome! Glad we figured it out 馃槅