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|