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
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開始
まとめ!
- ObservableはColdな動作、複数のObserverをsubscribeすれば複数のObserverが作成される。
- SubjectはHotな動作、複数のObserverをsubscribeすれば、Streamが分岐して流れる。