RxSwift のドキュメントを読む
RxSwift のドキュメントを読む
RxSwift のリポジトリを眺めてたら丁寧に解説されてるっぽい Playground 発見。
RxSwift/Rx.playground at master · ReactiveX/RxSwift
「あ、こんなのあるのね」(知らんかった
なので読んでみた。
Playground によるインタラクティブなドキュメント、素晴らしい。
Setup
RxSwift/Contents.swift at master · ReactiveX/RxSwift
てな感じで、本 Playground の使い方も丁寧に書いてある。
- とりあえず RxSwift のリポジトリを clone
- RxSwift/Rx.xcworkspace を Xcode で開く
- Scheme から RxSwift-macOS を選択して
Command + b
- Xcode の
Command + 1
で Project navigator から Rx を開く Command + Shift + y
で Debug Area を開く
これで準備完了
以下、読みながらメモしていく。
紹介
なぜ RxSwift を使うのか
- イベントドリブンなコードを簡潔に書く
- 以下のような処理を一貫して行うシステムが Rx
@IBAction
ハンドラの記述- キーボードの位置変化を検出する監視
- URLセッションの完了時の処理をクロージャーで渡す
- キー値監視
- RxSwiftは Reactive Extensions の公式実装
コンセプト
- Observableの各インスタンスは単なるシーケンス
Observable
シーケンス の、SwiftSequence
に対する主な利点は、要素を非同期的に受け取ることができること- これがRxSwiftの本質
- 他のすべてはこの延長
- Observable(ObservableType)はSequenceと同等
- ObservableType.subscribe(_ :)メソッドはSequence.makeIterator()と同等
- ObservableType.subscribe(_ :)は、observer(ObserverType)パラメータをとる
- このパラメータは、Observableによって送出されたシーケンスイベントと要素を自動的に受け取るために登録される
- 返されたジェネレータでnext()を手動で呼び出す必要がない
- このパラメータは、Observableによって送出されたシーケンスイベントと要素を自動的に受け取るために登録される
- Observableが next event(Event.next(Element)) を発行する場合、Observableはイベントを引き続き発行できる
- Observableがエラーイベント(Event.error(ErrorType)) または完了イベント(Event.completed) を発行すると、Observableシーケンスはサブスクライバに追加イベントを発行できない
- Sequence grammar を使ってこのことを簡潔に表現できる
next* (error | completed)?
- marble diagrams を使ってより視覚的に表現することもできる
--1--2--3--4--5--6--|----> // "|" = Terminates normally --a--b--c--d--e--f--X----> // "X" = Terminates with an error --tap--tap----------tap--> // "|" = Continues indefinitely, such as a sequence of button taps
Observables and observers (aka subscribers)
- Observablesは、サブスクライバが存在しない限り、サブスクリプションクロージャーを実行しない
- 次の例では、Observableのクロージャは実行されない
example("Observable with no subscribers") { _ = Observable<String>.create { observerOfString -> Disposable in print("This will never be printed") observerOfString.on(.next("😬")) observerOfString.on(.completed) return Disposables.create() } }
- 次の例では、subscribe(_ :)が呼び出されたときにクロージャが実行される
example("Observable with subscriber") { _ = Observable<String>.create { observerOfString in print("Observable created") observerOfString.on(.next("😉")) observerOfString.on(.completed) return Disposables.create() } .subscribe { event in print(event) } }
- Observables をどう作成したかについては次章で紹介
- subscribe(_ :) は、サブスクリプションなどの使い捨てリソースを表すDisposableインスタンスを返す
- 通常は DisposeBagインスタンスに追加するなどして適切に処理する
- Disposing の章で詳しく説明する
- 通常は DisposeBagインスタンスに追加するなどして適切に処理する
こんな感じか。
英語も平易だし読みやすい。
その他
Mac リプレースして Git の tab 補完を設定。
$ find / -name git-completion.bash ・ ・ ・ /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash ・ ・ ・
ということで ~/.bash_profile
に以下を追記。
source /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash
以上。