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

如何在RxSwift中使用Enum发送不同的网络请求

RxSwift 实现按钮触发状态更新+请求的方案

1. 定义业务状态枚举

先定义表示业务状态的枚举:

enum BusinessState {
    case stateA
    case stateB
}

2. 核心实现逻辑

用BehaviorRelay维护可观察的当前状态,结合按钮点击事件完成「更新状态→发送请求」的流程:

import RxSwift
import RxCocoa

class YourViewModel {
    let currentState = BehaviorRelay<BusinessState>(value: .stateA) // 初始状态可按需调整
    let disposeBag = DisposeBag()
    
    init(buttonA: UIButton, buttonB: UIButton) {
        bindButtonActions(buttonA: buttonA, buttonB: buttonB)
    }
    
    private func bindButtonActions(buttonA: UIButton, buttonB: UIButton) {
        // 按钮A点击逻辑
        buttonA.rx.tap
            .do(onNext: { [weak self] in
                // 先更新状态
                self?.currentState.accept(.stateA)
            })
            .flatMap { _ in
                // 发送stateA对应的请求
                return self.sendRequestForStateA()
            }
            .subscribe(onNext: { responseData in
                // 处理请求成功结果
                print("StateA 请求成功:\(responseData)")
            }, onError: { error in
                // 处理请求错误
                print("StateA 请求失败:\(error.localizedDescription)")
            })
            .disposed(by: disposeBag)
        
        // 按钮B点击逻辑
        buttonB.rx.tap
            .do(onNext: { [weak self] in
                // 先更新状态
                self?.currentState.accept(.stateB)
            })
            .flatMap { _ in
                // 发送stateB对应的请求
                return self.sendRequestForStateB()
            }
            .subscribe(onNext: { responseData in
                // 处理请求成功结果
                print("StateB 请求成功:\(responseData)")
            }, onError: { error in
                // 处理请求错误
                print("StateB 请求失败:\(error.localizedDescription)")
            })
            .disposed(by: disposeBag)
    }
    
    // 模拟请求函数,实际替换成你的网络请求逻辑
    private func sendRequestForStateA() -> Observable<Data> {
        return Observable.create { observer in
            let task = URLSession.shared.dataTask(with: URL(string: "https://your-api-for-stateA.com")!) { data, _, error in
                if let error = error {
                    observer.onError(error)
                    return
                }
                guard let data = data else {
                    observer.onError(NSError(domain: "RequestError", code: -1, userInfo: [NSLocalizedDescriptionKey: "无返回数据"]))
                    return
                }
                observer.onNext(data)
                observer.onCompleted()
            }
            task.resume()
            return Disposables.create {
                task.cancel()
            }
        }
    }
    
    private func sendRequestForStateB() -> Observable<Data> {
        return Observable.create { observer in
            let task = URLSession.shared.dataTask(with: URL(string: "https://your-api-for-stateB.com")!) { data, _, error in
                if let error = error {
                    observer.onError(error)
                    return
                }
                guard let data = data else {
                    observer.onError(NSError(domain: "RequestError", code: -1, userInfo: [NSLocalizedDescriptionKey: "无返回数据"]))
                    return
                }
                observer.onNext(data)
                observer.onCompleted()
            }
            task.resume()
            return Disposables.create {
                task.cancel()
            }
        }
    }
}

关键逻辑说明

  • BehaviorRelay:用来持久化当前业务状态,通过accept(_:)更新值,其他组件可订阅currentState监听状态变化。
  • do操作符:在不改变事件流的前提下插入「更新状态」的副作用,确保状态更新优先于请求发送。
  • flatMap操作符:将按钮点击事件转换为请求的Observable,实现点击→更新状态→发请求的链式流程。
  • disposeBag:管理所有订阅的生命周期,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Frank8888

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:37:02