RxSwift研究読本で、RxSwiftのお勉強

booth.pm

github.com

RxSwiftの概要

RxSwiftとは何か

iOS開発のイベント処理

RxSwiftは複雑になりがちなイベント処理をデータの流れ(ストリーム)として統一的に扱うReactiveX(Reactive Extensions: Rx)をベースとしたライブラリです。 イベント発生時に流れてくるストリームに反応(リアクション)して処理を行うことを実現します。

Rxとは、オブザーバーパターンイテレータパターン関数型プログラミングのアイデアを組み合わせたもの

 キーワード

  • ストリーム
    • データがイベントとして連なった流れ
  • Observable
    • RxSwiftにおけるストリームを生産するもの。クラスObservableで提供される
  • オペレータ
    • ストリームに対して処理を行うメソッド。mapやfilterなど
  • ストリームの購読
    • ストリームから伝播されてくるイベントを順次処理する仕組み

RxSwiftによるMVVMパターン

f:id:panchan817:20200615161358p:plain

  • View(ViewController)
    • UIロジックを担当
    • Viewの生成、表示非表示、タッチイベントの設定など
  • ViewModel
    • プレゼンテーションロジックを担当
    • ビジネスロジックの結果をUIに表示するための処理
    • 具体的なUI表示への関心を分離している
  • 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

RxExampleによるRxとMVVMの解説

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) -> Disposable)を持つ。 引数に指定したsubscribeをsubscribeHandlerとして保持するAnonymousObservableを返す AnonymousObservableはrunメソッドを持ち、その中でsubscribeHandlerを呼ぶ runメソッドはAnonymousObservableがsubscribeされたときに実行される。 つまり、 Observable.create{ observer in ... }.subscribe( onNext: ... ) としたとき、{ observer in ... }は、subscribe( onNext: ... )を通った後、observableのrunメソッドの実行結果として実行される!!