Я использую Moya Rx swift, и я хочу поймать ответ, если код состояния 401 или 403, затем вызвать запрос токена обновления, затем снова вызвать / повторить исходный запрос, и для этого я выполнил этот Link, но я немного изменил его в соответствии со своими потребностями
public extension ObservableType where E == Response {
/// Tries to refresh auth token on 401 errors and retry the request.
/// If the refresh fails, the signal errors.
public func retryWithAuthIfNeeded(sessionServiceDelegate : SessionProtocol) -> Observable<E> {
return self.retryWhen { (e: Observable<Error>) in
return Observable
.zip(e, Observable.range(start: 1, count: 3),resultSelector: { $1 })
.flatMap { i in
return sessionServiceDelegate
.getTokenObservable()?
.filterSuccessfulStatusAndRedirectCodes()
.mapString()
.catchError {
error in
log.debug("ReAuth error: \(error)")
if case Error.StatusCode(let response) = error {
if response.statusCode == 401 || response.statusCode == 403 {
// Force logout after failed attempt
sessionServiceDelegate.doLogOut()
}
}
return Observable.error(error)
}
.flatMapLatest({ responseString in
sessionServiceDelegate.refreshToken(responseString: responseString)
return Observable.just(responseString)
})
}}
}
}
И мой протокол:
import RxSwift
public protocol SessionProtocol {
func doLogOut()
func refreshToken(responseString : String)
func getTokenObservable() -> Observable<Response>?
}
Но он не работает, и код не компилируется, я получаю следующее:
«Наблюдаемый» нельзя преобразовать в «Наблюдаемый ‹_›»
Я просто говорю о своих первых шагах к RX-swift, так что это может быть просто, но я не могу понять, что не так, за исключением того, что мне нужно вернуть тип, отличный от того, который я возвращаю, но я не знаю, как и где сделать так.
Ваша помощь очень ценится, и если у вас есть лучшая идея для достижения того, что я пытаюсь сделать, вы можете предложить ее.
Заранее спасибо за помощь.
retryWhen
, чтобы выявить основную проблему. - person Shai Mishali   schedule 30.07.2018