You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RxSwift中如何修改runSample函数实现满足条件时从foo1重试流

解决方案

核心思路是利用RxSwift的错误重试机制实现需求:当foo2()返回false时主动抛出一个自定义错误,触发上游序列重试,即可重新执行foo1();只有foo2()返回true时才继续执行后续的foo3()。

具体修改步骤

  1. 先在类中定义一个私有错误类型,用于标记foo2()返回false的场景
  2. 对foo2()的返回值做分支处理:返回false则抛错触发重试,返回true则继续向下传递
  3. 对包含foo1()、foo2()的上游序列添加重试操作符
  4. 若需要限制重试次数,可使用带参数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:36:03