LoginSignup
77
55

More than 3 years have passed since last update.

【iOS】SubjectとRelay、そしてTraitsについての整理

Last updated at Posted at 2018-10-26

SubjectとRelay、そしてTraitsに関してまとめてみました。

RxSwiftを勉強していく中で
Subject、Relay、Signal、Driveといった用語が出てきてその都度検索して理解していたのですが、どれがどれだったのか曖昧になることが多々あり整理した方が良いと思い本記事を書きました📝

Subject

SubjectはObservable且つObserverなものです
= イベントの検知ができる、イベントの発生もできる

イベントとしては
onNext, onError, onComplete
が流れます。

  • AsyncSubject
  • BehaviorSubject
  • PublishSubject
  • ReplaySubject

という4つのSubjectがあります。

AsyncSubject

AsyncSubjectのonCompletedが呼ばれた直後に、onNextで渡された最後の値だけが流れます。

S.AsyncSubject.png

最後の値しか必要でない時に、コールバックを受け取る実装をするのに便利です。
(値を受け取るまではロード画面を表示し、値を受け取った場合はダイアログを消し、受け取った値に基づいて特定の処理をする場合など)

BehaviorSubject

初期値をもつSubjectです。
直前に渡された値を保持しsubscribe()された際にその値(初回の場合は初期値)を流します。
onNext,onError, onCompletedは発生次第そのまま流れます。

S.BehaviorSubject.png

PublishSubject

初期値をもたないSubjectです。
onNext,onError, onCompletedは発生次第そのまま流れます。
シンプル。

S.PublishSubject.png

ReplaySubject

subscribe後に値を流します。
bufferSizeに指定した数だけ値を流します。

S.ReplaySubject.png

Relay

Subjectのラッパーです。

 概要  イベント
PublishRelay PublishSubjectのwrapper。初期値なし。 onNext
BehaviorRelay BehaviorSubjectのwrapper。初期値設定可能。 onNext

ObservableTypeプロトコルに準拠していますが、Subjectと違いObserverTypeには準拠していません。
また、nextだけが流れ、errorやcompleteは流れません。

イベントは以下のようにして流すことができます。

let somerRelay = BehaviorRelay<String>(value: "")
somerRelay.accept("ABC")
somerRelay.accept("DEF")

Traits

Traitは簡単なObservableのラッパーで、以下のようなものが定義されています。

Rx  Traits 
RxCocoa Driver
Signal
ControlProperty / ControlEvent
RxSwift Single
Completable
Maybe

RxCocoa traits

Driver

  • エラーを流さない
  • メインスレッドで実行される
  • replay(1) = 直近の値を含めてイベントを流す (リプレイはその名の通り、同じ物を繰り返す意で捉えるといいと思います)

Signal

  • replayしないDriver

その他はDriverと同じで、エラーは流れずメインスレッドで実行されます

ControlProperty / ControlEvent

ControlProperty

  • エラーを流さない
  • replay(1)
  • メモリの割り当てが解放されるとcompleteが流れる
  • メインスレッドで実行される

ControlEvent

  • エラーを流さない
  • 購読時に初期値をながさない
  • メモリの割り当てが解放されるとcompleteが流れる
  • メインスレッドで実行される

RxSwift traits

Single

名前の通り単一の要素を流す場合に用います。

  • 1つの値かエラーを流す

一般的な使用例としては、レスポンスまたはエラー情報を返すHTTPリクエストがあります。永続的なストリームを必要とせず、単一の要素だけを扱う場合はSingleを使えます。

Completable

completeかerrorイベントを流します。
要素は流れません。

  • 要素を流さない
  • completeかerrorイベントを流す

Maybe

SingleとCompletableを組み合わせたようなものです。

  • completeか単一の値、もしくはエラーが流れます

ストリームに値を流したいが、必ずしもそれが必要でない場合はMaybeが使えます。

参考

77
55
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
77
55