タコさんブログ

プログラミングメモと小言

RxSwift 入門 その5

Combination operators

RxSwift 入門 その4 - タコさんブログ の続き。
今回は、RxSwiftプレイグラウンドの Combination operators の項。
この項では、単一のObservableを生成するために、多数のソースObservablesと連携するオペレータに関して説明してある。

以下、プレイグラウンドに説明してあるCombinationに関するオペレータ。

  • startWith
  • combineLatest
  • zip
  • merge
  • switchLatest

startWith

startWith オペレータは、ソースObservableからアイテム(イベント)を送信する前に、特定のアイテムのシーケンス(ストリーム)を送信する。

let stream = [2,3].toObservable()
_ = stream
  .startWith(1)
  .startWith(0)
  .subscribe {
    print($0)
  }

この出力は、

Next(0)
Next(1)
Next(2)
Next(3)
Completed

このマーブルダイアグラムは以下のように表せられる。

-----2-3|
   ↓ startWith(1)
---1|
 ↓ startWith(0)
-0|
↓ 結果
-0-1-2-3|

combineLatest

combineLatestオペレータは、2つのObsrvablesの内どちらかから1つのアイテムが送信される時、指定された関数によって、各Observableから送信される最新のアイテムを結合し、この関数の評価に基づいたアイテムを送信する。

let s = PublishSubject<Int>()
let t = PublishSubject<String>()
// s,t を結合
_ = Observable.combineLatest(s, t) {
    "\($0)\($1)"
  }
  .subscribe {
    print($0)
  }

s.onNext(1)
t.onNext("a")
s.onNext(2)
t.onNext("b")

この出力は、

Next(1a)
Next(2a)
Next(2b)

このマーブルダイアグラムは以下のように表せられる。

s -1-2--
t --a-b-
↓ combineLatest(s, t) { "\($0)\($1)" }
r  --122-
     aab
// r:resultの意味

zip

多数のObservablesが送信するアイテムを指定した関数によって結合し、その関数の結果に基づき、各組み合わせの単一のアイテムを送信する。

let s = (0...4).toObservable()
let t = ["a", "b", "c"].toObservable()
// zip
_ = Observable.zip(s, t) {
    "\($0)\($1)"
  }
  .subscribe {
    print($0)
}

この出力は、

Next(0a)
Next(1b)
Next(2c)
Completed

このマーブルダイアグラムは以下のように表せられる。

s -0-1-2-3-4|
t --a-b-c|
 ↓ zip(s, t) { "\($0)\($1)" }
r --0-1-2|
    a-b-c|

merge

mergeオペレータは、多数のObservablesから送信されるアイテムをマージすることによって、1つのObservableに結合する。

let s = PublishSubject<Int>()
let t = PublishSubject<Int>()

_ = Observable.of(s, t)
  .merge()
  .subscribe {
    print($0)
  }

s.on(.Next(1))
t.on(.Next(2))
s.on(.Next(1))
s.on(.Next(1))
t.on(.Next(2))

この出力は、

Next(1)
Next(2)
Next(1)
Next(1)
Next(2)

このマーブルダイアグラムは以下のように表せられる。

s -1--1--1--
t --2-----2-
 ↓ merge
r -12-1--12-

switchLatest

switchLatestオペレータは、Observablesを送信するObservableを、それらのObservablesの直前に送信されたアイテムを送信する単一のObservableへ変換する。

let s = Variable(0)
let t = Variable(10)
// u は Observable<Observable<Int>> のようなもの
let u = Variable(s.asObservable())

_ = u.asObservable()
  .switchLatest()
  .subscribe {
    print($0)
  }

s.value = 1
s.value = 2
u.value = t.asObservable()
t.value = 11
t.value = 12
s.value = 3
s.value = 4

この出力は、

Next(0)
Next(1)
Next(2)
Next(10)
Next(11)
Next(12)
Completed

このマーブルダイアグラムは以下のように表せられる。

s -0-1-2----3-4|
t -------1-1-1|
         0 1 2|
 ↓ switchLatest
r -0-1-2-1-1-1|
         0 1 2|

参考URL