[メモ]RxSwiftを理解したい


iOS開発において今やimportされていないプロジェクトはほとんどないかと思われるRxSwiftですが、swiftでのiOS開発を初めて3ヶ月ほど経過し、これを理解していないとiOS開発において人権がないことを理解しました。

なので勉強していきたいと思います。

ちなみに僕のRxSwiftに関する理解は

  • インターン先のコードで何度か(何度も)見かけたことはある
  • インターン先のiOSエンジニアの方に5-10分程度、簡単に解説をしてもらったことがある
  • Rxの思想の元になっている関数型言語の経験はない

なので同じ温度感の人がいればぜひ目を通していただけると嬉しいです。
またRxSwift理解している人で、もしこれを読んでいただけたのであればご指摘等あればじゃんじゃん頂けると嬉しいです。

今回はRxSwiftに関する概念的理解をする投稿とします。実際にサンプルコードとかは余力、モチベがあればPart2として投稿します。

Rx(Reactive Extensions)について

非同期/イベント/時間に関する処理を、LINQ形式で簡潔かつ宣言的に記述することができるC#のさいきょうライブラリ

思想とか概念というよりかはそもそもライブラリらしいです。
Rx内ではこのイベントをObservableというclassとして扱って処理していく形になっているそうです。

本家:http://reactivex.io/

RxSwiftについて

登場人物:

  • Observable
    • 多分、イベントと同じものとして理解していいものだと思われる。RxSwift内では用いたいclassに対してObservable<User>みたいにすることでRxSwiftの記述に対応されたclassを定義することができる。
  • Subscribe
    • イベントを順次読み込んでいくことを表しているもの。なのでsubcribe(onNext: )のようなイベントを次に進ませるような形で書いていく。
  • Subject
    • 購読されるもの。ObservableObserverどちらの性質も持ち合わせている。インスタンスをイベント中に好きなタイミングで発火されることができる。
  • Observer
    • Observableを監視しているもの。Observableの状態が変化することを認識し、updateとして伝達する。
  • DisposeBag
    • Observableでまとまっていた情報を出力する。中の情報が正確に読み取られない(どこかで何かしらの問題が起きている)と出力することはない。

あたりは何度も出てくるので何となく理解している必要があります。

メリット

まだ言語化できるほど理解してないです。

強いていうなら

  • Observableを用いて処理を行っている間は外部の値を不用意に変更することが発生しにくいのでテストが書きやすい
  • MVVMの設計を採用し、fatViewControllerになることを防ぐことができる

デメリット

  • 学習コスト・実装コストが不用意に高すぎる
  • データバインディングがメモリ効率に悪影響を与える

特徴

時間の概念が存在する

debounceというオペレータの存在によってインクリメンタルサーチとかのタイミングで時間の経過を利用したロジックを扱うことができます。

MVVMを扱うことができる

メリットの部分でも紹介しましたが、MVVM(Model-View-ViewModel)の設計を用いて開発することができます。RxCocoaというUIKitをRxSwiftの記述を可能にするライブラリが存在します。
Modelにはビジネスロジックを。ViewModelにはプレゼンテーションロジックを。ViewにはUIを。という分離した考え方で行うことができます。
(ビジネスロジックという言葉は僕は理解しにくいし、抽象的すぎるのではないかと思っています。どちらかというとどうAPIで受け取ったデータに対してアクセスするかみたいなものだと思っています。)

参考資料

RxExampleのコードでRxSwiftのvalidationのコードを紹介しているのが実例あって見てみると良さそうです。
https://github.com/ReactiveX/RxSwift

上のサンプルの存在もこの本を読んでいて知りました。この記事を書く上でも参考になっている部分は多いのでちゃんと学びたい場合は購入を勧めます!僕もインターン先のiOSエンジニアの方に勧めていただきました。
https://swift.booth.pm/items/1076262