Tana Gone
Tana Gone
1 min read

Categories

Tags

RxSwift

次のコードを解読する。Observableのfactory method createは引数一つのclosureを受取る。このclosureはObservableの振舞いを記述するものだ。引数はobserver: Observerで、そのonメソッドをEvent Enum、.next(1), …, .completedの6つを引数にして呼出す。

observerのonメソッドはnotifyと言える様なメソッド。

let source : Observable = Observable.create { observer in
    for i in 1...5 {
        observer.on(.next(i))
    }
    observer.on(.completed)

    // Note that this is optional. If you require no cleanup you can return
    // `Disposables.create()` (which returns the `NopDisposable` singleton)
    return Disposables.create {
        print("disposed")
    }
}

source.subscribe {
    print($0)
}

結果は、

next(1)
next(2)
next(3)
next(4)
next(5)
completed
disposed

createの引数は、{os:Observer->Void}で戻値はObservableのインスタンスsource。

createへ引数で渡すClosure内では、ObserverがどんなEventを受取るのか?を記述する。上記のソースでは、next列挙子が入った5個のEventを受取り、最後にcompleted列挙子が入ったEventを受取る。

sourceがsubscribeメソッドで受取る{()->Void}では、値入り列挙子から値を取出された後、それをどう加工するのか?記述する。上記の例では、{print($0)}

Subjectとは何か?Observableとは何が異なるのか?

Observableはsubscribeされるまで動作しない。

Observable.of(1,2,3)
  .map { n -> Int in
     print(n)
     return n
   }

これは、誰もsubscribeしていないので動作しない。そこでsubscribeすると、Observableから派生したMapが生成される。もう一回subscribeするともう一個のMapが生成される。すなわちStreamが2本生成される。subscribeメソッドはfactoryメソッドなのだ。これがObserbableの性質。Coldな性質と言われる。

let o = Observable.of(1,2,3)
  .map { n -> Int in
     print(n)
     return n
   }
o.subscribe(observer1) // => 1, 2, 3
o.subscribe(observer2) // => 1, 2, 3

今日こそ理解するHot / Cold

let subject = PublishSubject<Int>()
subject
  .map { n -> Int in
    print(n)
    return n
  }
subject.onNext(1)
subject.onNext(2)
subject.onNext(3) 

これも誰もsubscribeして無いので動作しない。subjectは直ぐに動作を開始する、Hotな性質を持っているが、Mapはsubscribeするまで動作しないので。

では、Hot変換メソッドpublishを使ってObservableからSubjectを作る。

let o = Obserbable.of(1, 2, 3)
  .map { $0 * 2 }
  .publish()
o.subscribeNext { print($0) } // 2, 4, 6
o.connect() // Stream開始
                                                                                
o.subscribeNext { print($0) } // 何も表示されない。

Stream開始時点で登録されたObserver(or Closure)へデータが流れる。一旦発生したEventは再度流れない。

しかし、次の例では、2回表示される。Streamが分岐されるので。これが、Hotな性質、動作。

let o = Obserbable.of(1, 2, 3)
  .map { $0 * 2 }
  .publish()
o.subscribeNext { print($0) } // 2, 4, 6
o.subscribeNext { print($0) } // 2, 4, 6
o.connect() // Stream開始
                                                                                

まとめ!

  1. ObservableはColdな動作、複数のObserverをsubscribeすれば複数のObserverが作成される。
  2. SubjectはHotな動作、複数のObserverをsubscribeすれば、Streamが分岐して流れる。

RxSwiftのHot/Coldを理解する