RxSwift的介绍与使用

目录

一、RxSwift 简介

RxSwift 是 Swift 语言的响应式编程框架,基于 ReactiveX(Reactive Extensions) 标准实现。它通过 观察者模式函数式编程 思想,简化异步事件处理和数据流管理,特别适合处理 UI 事件、网络请求、数据绑定等场景。

二、核心概念

  1. Observable:数据源/事件流(被观察者)
  2. Observer:订阅者(观察者)
  3. Operator:操作符(转换/过滤/组合数据流)
  4. Scheduler:线程调度器(管理操作执行线程)
  5. Disposable:资源管理(取消订阅)

三、基础使用示例

3.1、创建 Observable & 订阅事件

swift 复制代码
import RxSwift

let disposeBag = DisposeBag()

// 创建 Observable
let stringObservable = Observable.just("Hello RxSwift!")
let numbersObservable = Observable.of(1, 2, 3)

// 订阅事件
stringObservable
    .subscribe(
        onNext: { print($0) },
        onError: { print("Error: \($0)") },
        onCompleted: { print("Completed") }
    )
    .disposed(by: disposeBag)

/* 输出:
Hello RxSwift!
Completed
*/

3.2、操作符链式调用

swift 复制代码
Observable.of(1, 2, 3, 4, 5)
    .filter { $0 % 2 == 0 }      // 过滤偶数
    .map { $0 * 10 }             // 乘以10
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

/* 输出:
20
40
*/

3.3、绑定 UI 控件 (RxCocoa)

swift 复制代码
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var label: UILabel!
    
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 实时显示文本框内容(忽略空值)
        textField.rx.text
            .compactMap { $0 }  // 解包非空值
            .filter { !$0.isEmpty }
            .bind(to: label.rx.text)
            .disposed(by: disposeBag)
    }
}

3.4、网络请求 + 线程切换

swift 复制代码
func fetchUser() -> Observable<User> {
    return Observable.create { observer in
        let task = URLSession.shared.dataTask(with: URL(string: "https://api.example.com/user")!) { data, _, error in
            if let error = error {
                observer.onError(error)
            } else if let data = data {
                let user = try? JSONDecoder().decode(User.self, from: data)
                observer.onNext(user!)
                observer.onCompleted()
            }
        }
        task.resume()
        return Disposables.create { task.cancel() }
    }
}

// 使用示例
fetchUser()
    .subscribe(on: ConcurrentDispatchQueueScheduler(qos: .background)) // 后台线程请求
    .observe(on: MainScheduler.instance) // 主线程更新UI
    .subscribe(
        onNext: { user in
            print("用户名: \(user.name)")
        },
        onError: { print("请求失败: \($0)") }
    )
    .disposed(by: disposeBag)
3.5、组合多个请求 (flatMapLatest)
swift 复制代码
// 先登录 → 再获取用户信息
func login(username: String, password: String) -> Observable<String> {
    // 返回token的Observable
}

func fetchProfile(token: String) -> Observable<UserProfile> {
    // 使用token获取用户信息
}

login(username: "user", password: "pass")
    .flatMapLatest { token in
        fetchProfile(token: token) // 使用token获取用户信息
    }
    .subscribe(onNext: { profile in
        print("用户邮箱: \(profile.email)")
    })
    .disposed(by: disposeBag)

核心操作符速查

操作符 作用
map 数据转换
filter 条件过滤
flatMap 扁平化嵌套Observable
debounce 防抖动(搜索框场景)
combineLatest 合并最新值
merge 合并多个流
retry 失败自动重试

四、安装方式

Podfile 中添加:

ruby 复制代码
pod 'RxSwift', '~> 6.5'
pod 'RxCocoa', '~> 6.5'  # UI扩展

或使用 Swift Package Manager

swift 复制代码
dependencies: [
    .package(url: "https://github.com/ReactiveX/RxSwift.git", .upToNextMajor(from: "6.0.0"))
]

五、适用场景

  1. 实时搜索(debounce + flatMapLatest
  2. 表单验证(combineLatest 多个输入)
  3. 复杂异步依赖操作
  4. 多数据源绑定同一UI
  5. 状态管理(替代部分Delegate模式)

提示:RxSwift 学习曲线较陡,建议从简单场景逐步实践,配合 RxMarbles 可视化工具理解操作符行为。

相关推荐
2501_915909067 小时前
Python 爬虫 HTTPS 实战,requests httpx aiohttp 抓取技巧、证书问题与抓包调试全流程
爬虫·python·ios·小程序·https·uni-app·iphone
00后程序员张11 小时前
iOS 开发环境搭建完整指南 Xcode 安装配置、iOS 开发工具选择、ipa 打包与 App Store 上架实战经验
android·macos·ios·小程序·uni-app·iphone·xcode
折七14 小时前
expo sdk53+ 集成极光推送消息推送 ios swift
前端·javascript·ios
猪哥帅过吴彦祖14 小时前
Flutter 系列教程:布局基础 (上) - `Container`, `Row`, `Column`, `Flex`
前端·flutter·ios
90后的晨仔14 小时前
xcode 16 删除 Provisioning Profiles 文件的有效路径
ios
-晨-风-15 小时前
Flutter 运行IOS真机,提示无法打开“****”
flutter·ios
00后程序员张15 小时前
App 上架全流程指南,iOS 应用发布步骤、ipa 文件上传工具、TestFlight 分发与 App Store 审核经验分享
android·ios·小程序·https·uni-app·iphone·webview
2501_9160137415 小时前
iOS App 上架流程详解,苹果应用发布步骤、App Store 审核规则、ipa 文件上传与测试分发实战经验
android·ios·小程序·https·uni-app·iphone·webview
游戏开发爱好者816 小时前
Nginx HTTPS 深入实战 配置、性能与排查全流程(Nginx https
运维·nginx·ios·小程序·https·uni-app·iphone
游戏开发爱好者818 小时前
TCP 抓包分析:tcp抓包工具、 iOS/HTTPS 流量解析全流程
网络协议·tcp/ip·ios·小程序·https·uni-app·iphone