【发布时间】:2018-07-27 14:27:27
【问题描述】:
我正在使用 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>?
}
但它不起作用并且代码没有编译,我得到以下信息:
'Observable' 不能转换为 'Observable<_>'
我只是在谈论我与 RX-swift 的第一步,所以它可能很简单,但我不知道出了什么问题,除了我必须返回我要返回的类型之外的类型,但我不知道如何以及在哪里这样做。
非常感谢您的帮助,如果您有更好的想法来实现我想要做的事情,欢迎您提出建议。
提前感谢您的帮助。
【问题讨论】:
-
构建错误在哪里?您可能希望向
retryWhen添加显式返回类型以揭示潜在问题。 -
感谢您的评论,我解决了,现在我想在令牌刷新请求成功后重新启动我的请求,您知道如何在不使用 sup 类 Moya 的情况下执行此操作
标签: ios swift rx-swift refresh-token moya