タコさんブログ

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

RxSwift 入門 その1

とりあえずRxSwiftのプレイグラウンドのIntroductionに書いてあるサンプルを見ていく。Introductionには「RxSwiftを理解する鍵は、Observablesの概念を理解することである」と書いてあるとおり、主にObservableの生成について説明してある。

環境

準備

  • GitHubからReactiveX/RxSwiftをクローンする
  • Rx.xcworkspace を開いて、RxSwiftをビルド
    1. ビルドスキームを RxSwift-OSX に変更
    2. ビルド (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)と同様。

NopDisposableNopNo 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

参考URL