iOS
Swift

Rxswiftのよく出る単語をまとめてみた

RxSwiftを始めたばかりで、色々な用語があり自分なりにまとめてみました。

全部まとめるとボリュームが多いので、個人的によく見かけた単語について書いています!


RxSwiftとは

RxとはReactive Extensionsの略で非同期処理やイベント処理などを宣言的に記述することができるライブラリです。そのRxでSwift版としてリリースしたものががRxswiftです。種類はSwift以外にも多数の言語が用意されています。Rxの公式サイト

またFRP(Functional Reactive Programming)の一つで、FRPの例としてコードで表すと下記のようになります。

a = 1

b = 2
c = a + b
a = 2
print(c)
//3ではない
// 出力は4になる

これは「a + b」の関係を宣言的に記述することで、その時点の「a + b」ではなく結果としての値が宣言されているので、後から変更された値で計算されます。

スクリーンショット-2017-06-23-13.48.14.png

【Swift】RxSwiftを理解するより

イメージとしてはエクセルのような動きがわかりやすいです。

aかbの値の変化を監視し、もし変化したらトリガーとしてcの処理を走らせるイメージがFRPの例になります。


RxSwiftの特徴


メリット

・コードが全体が一貫する

・非同期処理を簡潔に書くことができる

・コールバックを減らせる


デメリット

・学習コストが高い

・場合によってはコード量が多い


良く出る単語をまとめてみた


Observalble

「監視できる」という名前ですが、イベントなど検知するためのクラスです。

下記3種類のイベントを通知させます。

イベントを発生する事は出来ません。

種類
説明

onNext
通常のイベントを通知する。何度でも送る事が可能。

onError
エラーの発生を通知する。一度だけ呼ばれ終了する。

onCompleted
完了を通知する。その時点で終了。


subscribe(購読)

subscribeはonNextなどを通知を開始するための使うメソッドです。subscribeと書くことで、Observableを購読することができ、イベントが発生するたびにsubscribeにonNextの中にある処理が実行されます。ややこしいですがその処理のことをObserverと呼び、Observalbleと間違えやすいです。

使い方としては下記のように扱います。

let disposeBag = DisposeBag() //下に説明あり

let observable textField.rx.tap.asObservable()

let observable = Observable.of("1","2","3")
_ = observable
.subscribe(onNext: {
print($0))
}, onError: { _ in
print("error")
}, onCompleted: {
print("終了")
}).disposed(by: disposeBag)


disposebag

subscribe(onNext等)をするといつまでたっても解除されずメモリーリークなどを起こします。

そこでdisposeBagに登録しておくことで、このクロージャを抜けた時にdisposeBagは開放されるので、そのタイミングで購読処理も解除されます。

購読(subscribe)をしたら、それを解除するために解除(disposeBag)を書いておけば概ね間違ってはないと思います。


subject 

Subjectは、ObservableとObserverの両方の機能を持っています。

subscriveしたら購読することが出来るObservableとしての機能をもち、onNextなどイベントを発生させることができます。

中でも代表的な3つのsubjectを紹介します。

クラス
説明

PublishSubject
subscribe後のイベントをだけを流す、過去の値も流れない

BehaviorSubject
subscribe時に、一つ過去のevent(最初にsubscribeする場合は初期値)を受け取れるSubject。

ReplaySubject
subscribe時に指定したbufferSize分の過去のeventを受け取れるSubject。

参照させて頂きました!

https://qiita.com/KentaKudo/items/4d7154c3dada93f11492


Relay

エラーを流さない、completeを流さないsubjectです。Nextのみ流せるようにしています。

PublishRelayはPublishSubjectのwrapper。

BehaviorRelayはBehaviorSubjectのwrapperになります。


operator

イベントの加工をするためのメソッドをoperator(オペレーター)と言います。

よく使われるものとしてはイベントの各要素を別の要素に変換するmapや指定条件が true になるイベントだけを通過させるfilterなどが挙げられます。

operatorは多く種類があり、下記のサイトにてまとめてくれています!

RxSwiftの機能カタログ