RxSwift研究読本で、RxSwiftのお勉強
RxSwiftの概要
RxSwiftとは何か
iOS開発のイベント処理
RxSwiftは複雑になりがちなイベント処理をデータの流れ(ストリーム)として統一的に扱うReactiveX(Reactive Extensions: Rx)をベースとしたライブラリです。 イベント発生時に流れてくるストリームに反応(リアクション)して処理を行うことを実現します。
Rxとは、オブザーバーパターン、イテレータパターン、関数型プログラミングのアイデアを組み合わせたもの
キーワード
- ストリーム
- データがイベントとして連なった流れ
- Observable
- RxSwiftにおけるストリームを生産するもの。クラスObservable
で提供される
- RxSwiftにおけるストリームを生産するもの。クラスObservable
- オペレータ
- ストリームに対して処理を行うメソッド。mapやfilterなど
- ストリームの購読
- ストリームから伝播されてくるイベントを順次処理する仕組み
RxSwiftによるMVVMパターン
- View(ViewController)
- UIロジックを担当
- Viewの生成、表示非表示、タッチイベントの設定など
- ViewModel
- プレゼンテーションロジックを担当
- ビジネスロジックの結果をUIに表示するための処理
- 具体的なUI表示への関心を分離している
- Model
- ビジネスロジックを担当
- MVVMではViewとViewModel以外の全てがModelであると言える
MVVMとはViewとViewModelの分離とデータバインディングのこと
→Modelを細分化するようなアーキテクチャと両立するもの。
UML図で理解するRxSwift
Subject
- Observable, Observer両方の機能を有している
- Observableクラスを継承し、ObserverTypeプロトコルを採用している
import RxSwift let subject = PublishSubject<String>() subject.subscribe(onNext: { print("onNext: \($0)") }) subject.onNext("A") subject.onNext("B") subject.onNext("C") subject.onCompleted() subject.onNext("D") //--output-- //onNext: A //onNext: B //onNext: C
- Subjectは購読される
- Subjectのインスタンスはイベントを任意のタイミングで発火できる
ControlProperty
- RxCocoaで定義
- Observable, Observer両方の機能を有している
- UIコンポーネントからのイベントをストリームとして取得するための型
RxExampleによるRxとMVVMの解説
- ViewController
- ViewModel
disposeBagとは
- まとめてObservableを処分するための仕組み
- disposeBagにObservableを保持させ、そのdisposeBagを破棄することでObservableをまとめて破棄できる!
- ViewControllerが破棄されるときに、そのプロパティも自動で破棄されるため、disposeBagの仕組みが働くようになっている
IBOutletからObservableの作成
let observable: Observable<String> = textField.rx.text.orEmpty.asObservable()
ViewModelの出力をViewにバインド
subscribe
ViewController
viewModel.signupEnable.subscribe( onNext: { [weak self] valid in self?.signupOutlet.isEnable = valid }).disposed(by: disposeBag)
ViewControllerでviewModelが持つObservableを購読し、イベントを発火している。
bind(to:)
ViewController
viewModel.validatedUsername .bind(to: usernameValidationOutlet.rx.validationResult) .disposed(by: disposeBag)
viewModelが持つObservableを購読し、RxCocoaのControlPropertyにストリームを流している?
雑メモ
Observable.create
https://github.com/ReactiveX/RxSwift/blob/master/RxSwift/Observables/Create.swift
引数にsubscribe((AnyObserver