精选文章

17. RxSwift / RxCocoa

2019-10-25 · RxSwift

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 的价值在于:把异步和状态统一为可组合的数据流。重点是控制订阅生命周期,避免泄漏。

JJ

作者简介

专注于内容创作、产品策略与设计实践。欢迎交流合作。

上一篇 下一篇