如何在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
相关产品推荐
相关产品推荐

