リアクティブを理解するために、
RxSwiftのPlaygroundが大変有用なことにやっと気づいたので、
Playgroundを読んで理解したことをまとめていきたいと思います。
(他にオススメのものありましたら教えて下さい。)
"川"という表現がありますが、
理解が進めば進むほど的を得た表現であることがわかったので、
適宜川的表現を使っていきたいと思います。
今回はCreating_and_Subscribing_to_Observablesです。
理解が浅いため間違い等ありましたらご指摘願います。
Observable
Observableは川です。
event(next, complete, errorのどれか)が流れてきます。
nextは何度も流れてきますが、completeかerrorのどちらか(両方はない)が流れてくると、
その川は枯れます(もうeventが流れてこない)。
Observableをsubscribeする(川を観察する)とeventが流れてくるので、
流れてくるeventに合わせて反応します。
Observableはsubscribeされたタイミングでeventが発生します。
(subscribeされていなくてもeventを発生できるSubjectTypeについては次回。)
never
event(next, complete, error)が一切発生しないObservable。
let disposeBag = DisposeBag()
let never川 = Observable<Void>
.never()
never川
.subscribe { print("never be called.") }
.addDisposableTo(disposeBag)
結果
empty
completeだけが発生するObservable。
let disposeBag = DisposeBag()
let empty川 = Observable<Void>
.empty()
empty川
.subscribe { print($0) }
.addDisposableTo(disposeBag)
結果
Completed
just
最初に指定したnextが一度発生して、completeするObservable。
let disposeBag = DisposeBag()
let just川 = Observable<String>
.just("🍑")
just川
.subscribe { print($0) }
.addDisposableTo(disposeBag)
結果
Next(🍑)
Completed
of
最初に指定した複数のnextが順に発生して、completeするObservable。
let disposeBag = DisposeBag()
let of川 = Observable<String>
.of("🍑1", "🍑2", "🍑3", "🍑4")
of川
.subscribe { print($0) }
.addDisposableTo(disposeBag)
結果
Next(🍑1)
Next(🍑2)
Next(🍑3)
Next(🍑4)
Completed
toObservable
SequenceType(Array, Dictionary, Set等)の要素を順にeventとして発生させ、
最後にcompleteするObservable。
ofと同様の動作をSequenceTypeに対して行う。
let disposeBag = DisposeBag()
let toObservable川 = ["🍑1", "🍑2", "🍑3", "🍑4"]
.toObservable()
toObservable川
.subscribe { print($0) }
.addDisposableTo(disposeBag)
結果
Next(🍑1)
Next(🍑2)
Next(🍑3)
Next(🍑4)
Completed
create
eventを任意に発生させることができるObservable。
let disposeBag = DisposeBag()
let create川 = Observable<String>
.create { observer -> Disposable in
observer.onNext("🍑🍑")
observer.onCompleted()
return NopDisposable.instance
}
create川
.subscribe { print($0) }
.addDisposableTo(disposeBag)
結果
Next(🍑🍑)
Completed
range
Int型(SignedIntegerTypeプロトコル)の初期値から、
count数分のeventを発生し、completeするObservable。
let disposeBag = DisposeBag()
let range川 = Observable
.range(start: 0, count: 10)
range川
.subscribe { print($0) }
.addDisposableTo(disposeBag)
実行結果
Next(0)
Next(1)
Next(2)
Next(3)
Next(4)
Next(5)
Next(6)
Next(7)
Next(8)
Next(9)
Completed
repeatElement
指定した値のeventを無限に発生し続けるObservable。
takeなどと一緒に使用。
let disposeBag = DisposeBag()
let repeatElement川 = Observable<String>
.repeatElement("🍑")
.take(3) // 3つだけにする
repeatElement川
.subscribe { print($0) }
.addDisposableTo(disposeBag)
結果
Next(🍑)
Next(🍑)
Next(🍑)
Completed
generate
Cのfor-loopのように、初期値・条件・ループ後の操作、を指定し、
条件を満たす間nextを発生させ、最後にcompleteするObservable。
let disposeBag = DisposeBag()
let generate川 = Observable<Int>
.generate(
initialState: 0,
condition : { $0 < 3 },
iterate : { $0 + 1 }
)
generate川
.subscribe { print($0) }
.addDisposableTo(disposeBag)
結果
Next(0)
Next(1)
Next(2)
Completed
[WIP]deferred
subscribeする度に新しいObservableを作成するObservable。
とのことですが、つまりどういうことなのか、
サンプルコードを見ても理解できなかったので、
書けるまで理解したら追記します。
どなたか教えてください(汗)。
error
指定したerrorだけを発生させるObservable。
extension String: ErrorType {}
let disposeBag = DisposeBag()
let error川 = Observable<Int>
.error("an error occured.")
error川
.subscribe { print($0) }
.addDisposableTo(disposeBag)
結果
Error(an error occurred.)
doOn
副作用を起こしたい時に利用するObservable。
(eventを覗き見したいとき。)
let disposeBag = DisposeBag()
let doOn川 = Observable
.of("🍑", "🍑", "🍑", "🍑")
.doOn { print("Intercepted: ", $0) }
doOn川
.subscribe { print($0) }
.addDisposableTo(disposeBag)
結果
Intercepted: Next(🍑)
Next(🍑)
Intercepted: Next(🍑)
Next(🍑)
Intercepted: Next(🍑)
Next(🍑)
Intercepted: Next(🍑)
Next(🍑)
Intercepted: Completed
Completed
終わりに
今回はObservablenの作り方について触れました。
次回はObservableの機能を持ちつつも、
好きな時にeventを発生させることのできる
SubjectTypeについて書きたいと思います。
参考