目录
一、RxSwift 简介
RxSwift 是 Swift 语言的响应式编程框架,基于 ReactiveX(Reactive Extensions) 标准实现。它通过 观察者模式 和 函数式编程 思想,简化异步事件处理和数据流管理,特别适合处理 UI 事件、网络请求、数据绑定等场景。
二、核心概念
- Observable:数据源/事件流(被观察者)
- Observer:订阅者(观察者)
- Operator:操作符(转换/过滤/组合数据流)
- Scheduler:线程调度器(管理操作执行线程)
- Disposable:资源管理(取消订阅)
三、基础使用示例
3.1、创建 Observable & 订阅事件
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、操作符链式调用
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)
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、网络请求 + 线程切换
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)
// 先登录 → 再获取用户信息
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 中添加:
pod 'RxSwift', '~> 6.5'
pod 'RxCocoa', '~> 6.5' # UI扩展
或使用 Swift Package Manager:
dependencies: [
.package(url: "https://github.com/ReactiveX/RxSwift.git", .upToNextMajor(from: "6.0.0"))
]
五、适用场景
- 实时搜索(
debounce
+flatMapLatest
) - 表单验证(
combineLatest
多个输入) - 复杂异步依赖操作
- 多数据源绑定同一UI
- 状态管理(替代部分Delegate模式)
提示:RxSwift 学习曲线较陡,建议从简单场景逐步实践,配合 RxMarbles 可视化工具理解操作符行为。