我尝试使用
retryWhen
函数来更新我的令牌,但不幸的是,它抛出了一个错误:
“any Cancelable”类型的值没有成员“retryWhen”
任务是
URLSessionTask
return Observable.create { observer in
..........
return Disposables.create {
self.task?.cancel()
}.retryWhen { error -> Observable<Error> in
return error.flatMapLatest { error -> Observable<Error> in
return refreshToken()
.flatMapLatest { response -> Observable<Error> in
return Observable.error(ResponseErrorCode.FAILED)
}
}
}
}
您能指导我如何修复它吗?
您在 Observable 的 create 函数中调用了重试。您应该在可观察对象上调用 retry ,而不是在尝试创建它时。这段代码中还存在其他几个错误。其中许多问题只需使用 RxCocoa 库中的 URLSession.shared.rx.response(request:)
或
URLSession.shared.rx.data(request:)
即可修复。另请注意,
retryWhen()
已被弃用,取而代之的是
return(when:)
。
return Observable.create { observer in
//..........
return Disposables.create {
self.task?.cancel()
}
}
.retry(when: { error -> Observable<Error> in
return error.flatMapLatest { error -> Observable<Error> in
return refreshToken()
.flatMapLatest { response -> Observable<Error> in
return Observable.error(ResponseErrorCode.FAILED)
}
}
})
此外,根据重试闭包的主体,这永远不会重试,因为它总是会发出错误。为了重试,闭包主体返回的 Observable 需要发出一个 next
事件。还有,为什么
task
里面有
self
?情况不应该是这样,但是如果没有看到更多的代码,我不确定你到底做错了什么。而不是你所拥有的,你的代码
应该看起来像这样:
return urlSession.rx.data(request: urlRequest)
.retry(when: { _ in refreshToken() })
或
return URLSession.shared.rx.data(request: urlRequest)
.retry(when: { _ in refreshToken() })