使用RxSwift和URLSessionTask时如何实现重试?

问题描述 投票:0回答:1

我尝试使用

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

您能指导我如何修复它吗?

ios swift rx-swift urlsession retrywhen
1个回答
0
投票

您在 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() })
    
© www.soinside.com 2019 - 2024. All rights reserved.