17. RxSwift / RxCocoa
目标:用事件流组织状态与交互,避免回调嵌套。
一、安装(SPM)
https://github.com/ReactiveX/RxSwift
二、基础 Observable
import RxSwift
let disposeBag = DisposeBag()
Observable.of(1, 2, 3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
三、常用操作符
Observable.of(1, 2, 3, 4)
.filter { $0 % 2 == 0 }
.map { $0 * 10 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
四、RxCocoa 绑定 UI
import RxCocoa
final class LoginVC: UIViewController {
private let username = UITextField()
private let loginButton = UIButton(type: .system)
private let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
username.rx.text.orEmpty
.map { !$0.isEmpty }
.bind(to: loginButton.rx.isEnabled)
.disposed(by: disposeBag)
loginButton.rx.tap
.subscribe(onNext: { print("login") })
.disposed(by: disposeBag)
}
}
五、MVVM 结构
final class LoginViewModel {
struct Input {
let username: Observable<String>
let password: Observable<String>
let loginTap: Observable<Void>
}
struct Output {
let canLogin: Observable<Bool>
}
func transform(input: Input) -> Output {
let canLogin = Observable
.combineLatest(input.username, input.password)
.map { !$0.isEmpty && !$1.isEmpty }
return Output(canLogin: canLogin)
}
}
RxSwift 的价值在于:把异步和状态统一为可组合的数据流。重点是控制订阅生命周期,避免泄漏。