Takahiro Octopress Blog

-1から始める情弱プログラミング

RxSwiftを勉強してみよう!(3)

RxSwiftのメソッドを見てみよう

前回に引き続きRxSwiftを勉強したいと思います。
今回はGitHub: Reactive/RxSwift API一覧からメインのメソッドを見ていきたいと思います。

asObservable

これはReactiveXで定義されているFromオペレータと同義です。
様々なオブジェクトをObservable型のデータに変換するためのオペレータです。

利用例は下記です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let disposeBag = DisposeBag()   // 自動unsubscribeのために必要

let array: [Int] = [1, 2, 3, 4, 5]
let variable = Variable(array)
variable.asObservable.subscribe { (event) in
  print("Event is \(event)")
}.addDisposableTo(disposeBag)

variable.value = [6, 7, 8]

// 結果は下記です。
Event is Next([1, 2, 3, 4, 5])
Event is Next([6, 7, 8])
Event is Completed

create

0からObservable型のデータを生成するためのオペレータです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let disposeBag = DisposeBag()   // 自動unsubscribeのために必要

let source = Observable.create { (observer: AnyObserver<Int>) -> Disposable in
  observer.onNext(1)
  observer.onCompleted()

  return AnonymousDisposable {
      print("Disposed")
  }
}

source.subscribeNext { (elem) in
  print("Event is \(elem)")
}.addDisposableTo(disposeBag)

// 結果は下記です
Event is 1
Disposed

deferred

SubscribeされたタイミングでObservable型のデータを生成するオペレータです。

1
2
3
4
5
6
7
8
9
10
11
let disposeBag = DisposeBag()   // 自動unsubscribeのために必要

let source = Observable.deferred { () -> Observable<Int> in
  return Observable.just(1)
}
source.subscribeNext { (elem) in
  print("Elem is \(elem)")
}.addDisposableTo(disposeBag)

// 結果は下記です
Event is 1

empty

空の(何の値も持たない)Observable型のデータを生成するオペレータです。
通常通り、終了処理は実行されます。

1
2
3
4
5
6
7
8
9
let disposeBag = DisposeBag()   // 自動unsubscribeのために必要

let source: Observable<Int> = Observable.empty()
source.subscribeNext { (elem) in
  print("Elem is \(elem)")
}.addDisposableTo(disposeBag)

// 結果は下記です。
// 空のため何も出力されません

never

空の(何の値も持たない)Observable型のデータを生成するオペレータです。
emptyと異なるのは終了処理が実行されないことです。

1
2
3
4
5
6
7
8
9
let disposeBag = DisposeBag()   // 自動unsubscribeのために必要

let source: Observable<Int> = Observable.never()
source.subscribeNext { (elem) in
  print("Elem is \(elem)")
}.addDisposableTo(disposeBag)

// 結果は下記です。
// 空のため何も出力されません

error

空の(何の値も持たない)Observable型のデータを生成するオペレータです。
empty, neverと異なり、エラーを持った終了処理を実行します。

1
2
3
4
5
6
7
8
9
10
let disposeBag = DisposeBag()   // 自動unsubscribeのために必要

let error = NSError(domain: "test", code: -1, userInfo: nil)
let source: Observable<Int> = Observable.error(error)
source.subscribeError { (error) in
  print("Error is \(error)")
}.addDisposableTo(disposeBag)

// 結果は下記です。
Error is Error Domain=test Code=-1 "(null)"

toObservable

様々なオブジェクトをObservable型のデータに変換するためのオペレータです。
asObservableとは利用方法が異なります。

1
2
3
4
5
6
7
8
9
10
11
let disposeBag = DisposeBag()   // 自動unsubscribeのために必要

let array: [Int] = [1, 2, 3]
array.toObservable().subscribeNext { (elem) in
  print("Number is \(elem)")
}.addDisposableTo(disposeBag)

// 結果は下記です。
Number is 1
Number is 2
Number is 3

interval

一定期間あけて処理を実行するためのオペレータです。
JavaScriptで言うところのsetTimeIntervalです。

1
2
3
4
5
6
7
8
9
10
let disposeBag = DisposeBag()   // 自動unsubscribeのために必要

let timer: Observable<Int> = Observable.interval(5.0, scheduler: MainScheduler.instance)
timer.subscribeNext { (count) in
  print("log output")
}.addDisposableTo(disposeBag)

// 結果は下記です。
// 5秒後に実行されます。
log output

just

引数に指定した特定の型を返却するObservable型のデータを生成するためのオペレータです。

1
2
3
4
5
6
7
8
9
let disposeBag = DisposeBag()   // 自動unsubscribeのために必要

let source = Observable.just(1)
source.subscribeNext { (elem) in
  print("Elem is \(elem)")
}.addDisposableTo(disposeBag)

// 結果は下記です。
Elem is 1

of

様々なオブジェクトをObservable型のデータに変換するためのオペレータです。
asObservabletoObservableとは利用方法が異なります。

1
2
3
4
5
6
7
8
9
let disposeBag = DisposeBag()   // 自動unsubscribeのために必要

let source = Observable.of(1)
source.subscribeNext { (elem) in
  print("Elem is \(elem)")
}.addDisposableTo(disposeBag)

// 結果は下記です。
Elem is 1

range

特定の範囲のInt型を持つObservable型データを生成するオペレータです。

1
2
3
4
5
6
7
8
9
10
11
let disposeBag = DisposeBag()   // 自動unsubscribeのために必要

let source: Observable<Int> = Observable.range(start: 1, count: 3)
source.subscribeNext { (elem) in
  print("Elem is \(elem)")
}.addDisposableTo(disposeBag)

// 結果は下記です。
Elem is 1
Elem is 2
Elem is 3

repeatElement

指定した回数、処理を実行するときに利用するObservable型データを生成するオペレータです。
takeメソッドを利用して回数を指定します。

1
2
3
4
5
6
7
8
9
10
11
let disposeBag = DisposeBag()   // 自動unsubscribeのために必要

let source = Observable.repeatElement(1).take(3)
source.subscribeNext { (elem) in
  print("Elem is \(elem)")
}.addDisposableTo(disposeBag)

// 結果は下記です。
Elem is 1
Elem is 1
Elem is 1

timer

一定時間経過後に処理を実行したい場合に利用するオペレータです。
JavaScriptで言うところのsetTimeoutです。

1
2
3
4
let timer: Observable<Int> = Observable.timer(5.0, scheduler: MainScheduler.instance)
timer.subscribeNext { (count) in
  print("log output")
}.addDisposableTo(disposeBag)

まとめ

さて、今回はCreating Observablesのみを取り上げさせて頂きましたが、いかがでしたでしょうか?
筆者もイマイチ使い方がわからなかったオペレータがたくさんあったので、多少なりとも使えそうな気がしてきました。
Transforming Observables, Filtering Observables …. と全て見ていけると良いのですが、結構数が多いですね。
時間があるときに続きを書きたいと思います。

と言ったところで本日はここまで。

Comments