RxSwift结合URLSessionTask使用retryWhen报错,求修复方案
问题修复方案
错误原因
retryWhen 是RxSwift中Observable序列的操作符,你当前错误地将它调用在 Disposables.create 返回的 Cancelable 实例上,而 Cancelable 类型并没有 retryWhen 方法,这就是报错的根本原因。
修复步骤
- 将
retryWhen从Observable.create闭包内部的返回值后移到整个Observable.create创建的序列之后。 - 调整
refreshToken后的逻辑:刷新令牌成功后应该让序列继续重试原请求,而不是直接返回错误(否则会无限触发重试逻辑)。
修正后的代码示例
return Observable.create { [weak self] observer in // 这里写原请求的逻辑,比如发起URLSessionTask并发送事件到observer self?.task = URLSession.shared.dataTask(with: yourRequest) { data, response, error in if let error = error { observer.onError(error) return } // 处理响应并发送事件 observer.onNext(data) observer.onCompleted() } self?.task?.resume() return Disposables.create { self?.task?.cancel() } } .retryWhen { errorObservable -> Observable<Void> in return errorObservable.flatMapLatest { error -> Observable<Void> in // 假设refreshToken()返回Observable<Token>,刷新成功后返回空序列让原请求重试 return refreshToken() .map { _ in () } // 转换为Void类型,触发重试 .catch { refreshError -> Observable<Void> in // 刷新令牌失败时,终止重试并传递错误 return Observable.error(refreshError) } } }
关键说明
retryWhen接收一个错误序列,返回一个控制重试时机的序列:当返回的序列发送元素时,原Observable会重新订阅;当返回的序列发送错误时,整个序列终止。- 务必在
Observable.create外部调用retryWhen,因为它是作用于整个Observable序列的操作符,而非闭包内返回的Disposable。
内容的提问来源于stack exchange,提问作者Mayumi
相关产品推荐
相关产品推荐

