RxSwift中如何修改runSample函数实现满足条件时从foo1重试流
解决方案
核心思路是利用RxSwift的错误重试机制实现需求:当foo2()返回false时主动抛出一个自定义错误,触发上游序列重试,即可重新执行foo1();只有foo2()返回true时才继续执行后续的foo3()。
具体修改步骤
- 先在类中定义一个私有错误类型,用于标记
foo2()返回false的场景 - 对
foo2()的返回值做分支处理:返回false则抛错触发重试,返回true则继续向下传递 - 对包含
foo1()、foo2()的上游序列添加重试操作符 - 若需要限制重试次数,可使用带参数的
retry(maxAttemptCount:)避免无限重试
修改后的完整代码
class SampleClass { // 自定义错误,用于标记foo2返回false的场景 private enum SampleError: Error { case foo2ReturnFalse } //////////////////////////////// // private //////////////////////////////// private func foo1() -> Observable<String> { // Do something return .just("TEST") } private func foo2() -> Observable<Bool> { // Do something return .just(false) // or true } private func foo3() -> Observable<String> { // Do something return .just("Result") } //////////////////////////////// // public //////////////////////////////// public func runSample() -> Observable<String> { // 把需要重试的上游逻辑包在单独的序列里 let upstream = Observable.just(()) .flatMap { [unowned self] _ in self.foo1() } .flatMap { [unowned self] _ in self.foo2() } .flatMap { isSuccess -> Observable<Void> in // foo2返回false时抛错触发重试 guard isSuccess else { return .error(SampleError.foo2ReturnFalse) } return .just(()) } // 这里用retry()会无限重试,若要限制次数可以改成retry(3)代表最多重试3次 return upstream .retry() .flatMap { [unowned self] _ in self.foo3() } } }
注意事项
- 如果担心
unowned self的安全问题,可以替换为weak self并添加解包逻辑,根据你自身的业务生命周期调整即可 - 无限制的
retry()可能导致无限循环,建议结合实际业务添加重试次数限制,或者添加重试间隔逻辑(可配合retry(when:)实现)
内容的提问来源于stack exchange,提问作者user3569109
相关产品推荐
相关产品推荐

