RxSwift 入門 その1
とりあえずRxSwiftのプレイグラウンドのIntroductionに書いてあるサンプルを見ていく。Introductionには「RxSwiftを理解する鍵は、Observablesの概念を理解することである」と書いてあるとおり、主にObservableの生成について説明してある。
環境
準備
- GitHubからReactiveX/RxSwiftをクローンする
- Rx.xcworkspace を開いて、RxSwiftをビルド
- ビルドスキームを RxSwift-OSX に変更
- ビルド (Cmd + B)
Observables
Observables は時間とともに送信されるイベントの列(ストリーム)。
Marble Diagrams (マーブルダイアグラム)はObservables(データストリーム)を視覚化する図形で、下の図のようなもの。
---◯---△---□---|-->
- 横線(-):Observableのタイムラインを表す
- 丸(◯)、三角(△)、四角(□):Observableによって送信されるアイテム(データ)を表す
- 縦線(|):Observableが正常に完了したことを表す
Observablesの生成とサブスクライブ
Observablesを生成するには、以下の関数が利用できる。
- empty
- just
- of
- toObservable
- create
- error
- deffered
Observableを監視する(observe, listen, subscribeなどの呼び方がある?)には subscribe メソッドを呼ぶ。subscribeの中で、プッシュされたイベントにリアクト(反応)する。今回は単純にコンソールに出力しているだけ。
empty 関数
empty は空ストリームを生成する。
.Completed メッセージを唯一送信する。
// ストリームを生成 let emptyStream: Observable<Int> = Observable.empty() // ストリームをサブスクライブする let subscription = emptyStream .subscribe { event in print(event) }
この出力は、
Completed
emptyのマーブルダイアグラムは、
--|-->
never 関数
never はエレメントまたは、完了を一度も送信しないストリームを生成する。
let neverStream: Observable<String> = Observable.never() let subscription = neverStream .subscribe { _ in print("このブロックは一度も呼び出されない") }
neverのマーブルダイアグラムは、
---->
just 関数
just は一つのイベントを含むストリームを生成し、サブスクライバーに2つのメッセージを送信する。
1つ目はイベントの値、2つ目は .Completed メッセージ。
let singleElementStream = Observable.just(32) let subscription = singleElementStream .subscribe { event in print(event) }
この出力は、
Next(32) Completed
just(32)のマーブルダイアグラムは、
--32--|-->
of 関数
Observable.of 関数は一定数のイベントのストリームを生成する。
let stream = Observable.of(0, 1, 2) let subscription = stream .subscribe { event in print(event) }
この出力は、
Next(0) Next(1) Next(2) Completed
Observable.of(0, 1, 2)のマーブルダイアグラムは、
--0--1--2--|-->
toObservable
toObservable はSequenceType (Array, Range とか) からシーケンスを生成する。
let streamFromArray = [0, 1, 2].toObservable() let subscription = streamFromArray .subscribe { event in print(event) }
出力、マーブルダイアグラムは Observable.of(0, 1, 2)と同様。
create 関数
create はクロージャからストリームを生成する。
この例はカスタム版のjust関数。
let myJust = { (singleElement: Int) -> Observable<Int> in return Observable.create { observer in observer.on(.Next(singleElement)) observer.on(.Completed) return NopDisposable.instance } } let singleElementStream = myJust(32) let subscription = singleElementStream .subscribe { event in print(event) }
出力、マーブルダイアグラムはjust(32)と同様。
※ NopDisposable の Nop は No Operation の略
error 関数
error はエラーで終了するストリーム(Observable)を生成する。
let error = NSError(domain: "Error Test", code: -1, userInfo: nil) let erroredStream: Observable<Int> = Observable.error(error) let subscription = erroredStream .subscribe { event in print(event) }
この出力は、
Error(Error Domain=Error Test Code=-1 "(null)")
errorのマーブルダイアグラムは、
--x-->
deffered 関数
deferred はオブザーバがサブスクライブするまで待ち、サブスクライブ後、Observableを生成する。
let deferredStream: Observable<Int> = Observable.deferred { print("creating") return Observable.create { observer in print("emmiting") observer.on(.Next(0)) observer.on(.Next(1)) return NopDisposable.instance } } print("firstSubscription") let firstSubscription = deferredStream .subscribe { event in print(event) } print("secondSubscription") let secondSubscription = deferredStream .subscribe { event in print(event) }
この出力は、
firstSubscription creating emmiting Next(0) Next(1) secondSubscription creating emmiting Next(0) Next(1)
マーブルダイアグラムは、
firstSubscriptionのストリーム --0--1--2--|--> secondSubscriptionのストリーム --0--1--2--|-->
その他
RxCocoaには、この他にもたくさんの役に立つメソッドが用意されている。例えば、
- KVOをラップする rx_observe
- @IBActionをラップする rx_tap
- NotificationCenterのイベントをラップする rx_notification