Help us understand the problem. What is going on with this article?

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

渋谷でエンジニア(2年目)をしていますyokiです🤗

今回は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が使えます。

参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away