techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

RxSwift のドキュメントを読む

RxSwift のドキュメントを読む

RxSwift のリポジトリを眺めてたら丁寧に解説されてるっぽい Playground 発見。

RxSwift/Rx.playground at master · ReactiveX/RxSwift

「あ、こんなのあるのね」(知らんかった

なので読んでみた。

Playground によるインタラクティブなドキュメント、素晴らしい。

Setup

RxSwift/Contents.swift at master · ReactiveX/RxSwift

てな感じで、本 Playground の使い方も丁寧に書いてある。

  1. とりあえず RxSwift のリポジトリを clone
  2. RxSwift/Rx.xcworkspace を Xcode で開く
  3. Scheme から RxSwift-macOS を選択して Command + b
  4. Xcode の Command + 1Project navigator から Rx を開く
  5. Command + Shift + y で Debug Area を開く

これで準備完了

以下、読みながらメモしていく。

紹介

なぜ RxSwift を使うのか

  • イベントドリブンなコードを簡潔に書く
  • 以下のような処理を一貫して行うシステムが Rx
    • @IBAction ハンドラの記述
    • キーボードの位置変化を検出する監視
    • URLセッションの完了時の処理をクロージャーで渡す
    • キー値監視
  • RxSwiftは Reactive Extensions の公式実装

コンセプト

  • Observableの各インスタンスは単なるシーケンス
    • Observable シーケンス の、Swift Sequence に対する主な利点は、要素を非同期的に受け取ることができること
    • これがRxSwiftの本質
    • 他のすべてはこの延長
  • Observable(ObservableType)はSequenceと同等
  • ObservableType.subscribe(_ :)メソッドはSequence.makeIterator()と同等
  • ObservableType.subscribe(_ :)は、observer(ObserverType)パラメータをとる
    • このパラメータは、Observableによって送出されたシーケンスイベントと要素を自動的に受け取るために登録される
      • 返されたジェネレータでnext()を手動で呼び出す必要がない
  • 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 の章で詳しく説明する

こんな感じか。

英語も平易だし読みやすい。

その他

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

以上。