Skip to content

Instantly share code, notes, and snippets.

@mironal
Last active November 12, 2022 03:27
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mironal/9eead7a5d812174cec238d68615f1dd6 to your computer and use it in GitHub Desktop.
Save mironal/9eead7a5d812174cec238d68615f1dd6 to your computer and use it in GitHub Desktop.
RxSwift と MVVM でiOS アプリを作る上で最低限の登場人物の理解.

RxSwift というか Rx 全般

RxSwift は ReactiveX の Swift 実装.

  • event: Stream に流れるイベント. 値、 error, complated のどれか.
  • Observer: on(event:) を持っている = event を流せる.
  • Observable: subscribe(observer:) -> Disposable を持っている = event を受け取れる/
  • Subject: Observer + Observable
    • PublishSubject: subscribe してから発生した event を受け取れる
    • ReplaySubject: subscribe 以前に発生した event も受け取れる. バッファサイズを指定する.
    • BehaviorSubject: 一つ過去の event を受け取れる. 初期値が必要.
  • Trants: Observable のラッパーで便利なものが用意されている.
    • Single: 値 か error のイベントが一回だけ発生する.
    • Completable: complate か error のイベントが一回だけ発生する.
    • Maybe: (complate か 値) または error が一回だけ流れる.

イベントが発生する側は Subject をインスタンス化して、外部へは Observable の形で公開するのが基本.

RxCocoa

Cocoa 特有の領域に関する機能.

  • PublishRelay: PublishSubject のラッパーだが error と completed が発生しない.
  • BehaviourRelay: BehaviorSubject のラッパーだが error と completed が発生しない.
  • Signal: エラーが発生しない, main スレッドで実行, subscribe してから発生した event を受け取れる.
  • Driver: エラーが発生しない, main スレッドで実行, 一つ前の event を受け取れる.
  • ControlEvent: エラーが発生しない, main スレッドで実行, メモリ割り当て開放時に complete が発生, subscribe してから発生した event を受け取れる.
  • ControlProperty: エラーが発生しない, main スレッドで実行, メモリ割り当て開放時に complete が発生, 一つ過去の event を受け取れる. 初期値が必要.
  • Binder: エラーイベントを処理しない, 指定した Scheduler (デフォルトは main) で実行. bind(to:) で bind 可能になる.

MVVM

Model <-> ViewModel <-> View で構成されるアーキテクチャ. ここでいう View には iOS の UIViewController が含まれます.

Model

  • Model に対する操作(ビジネスロジック)は retuen void な関数
  • 操作の結果は Observable で伝搬させる

ViewModel

  • Model と View の橋渡し役で表示に関わる処理 (プレゼンテーションロジック)を書く
    • Model のどの要素が UI のどの要素にマッピングされるか
    • UI のどのイベントが Model のどの操作にマッピングされるか

View

  • UI のレイアウトなど表示に係る処理
  • UI イベントの ViewModel への伝搬
  • ビジネスロジックは書かない
    • 例えばテキスト入力のバリデーションの処理などは書かない
    • テキストを ViewModel 経由で Model に渡して Model でバリデーションしてその結果を ViewModel 経由で View に渡して処理するのが正しい
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment