はじめに
RxSwiftを含めたRx全般において、処理の流れの基本的な設計として用いられるものの1つに、Observerパターンと呼ばれるデザインパターンがあります。デザインパターンとは、オブジェクト指向プログラミングの中で再利用可能な設計手法のことです。簡単に言うと、同じような処理方法のフォーマットを使いまわすことで、効率よくプログラムを組む設計手法の1つです。
連載第1回で紹介した通り、RxSwiftでは処理のやり方が共通しているので、Observerパターンの考え方を理解することがRxSwiftを使いこなすための第一歩と言えます。
RxSwiftにおけるObserverパターン(1)
RxSwiftで採用されているObserverパターン
Observerパターンとは、あるオブジェクトで発生したイベントを別のオブジェクト(オブザーバー)へ通知する処理で用いられるデザインパターンの1つです。
別の見方をすると、オブジェクトを監視してイベントが発生した場合に、そこのことをオブザーバーへ通知するモデルとも言えます。
RxSwiftで言うイベントとは、画面上で発生するタップイベントの他に、変数の値が変わった/APIから値が取得できたなどプログラム内におけるオブジェクトの状態の変化全てを指します。SwiftのUIControlEventなどよりも広い範囲を扱い、一般的なアプリ開発で指すSwift内のイベントよりも意味が大きいことに気をつけてください。
RxSwiftでは、イベントストリームの中で流れて来るデータの部分をデータストリームと呼びます。Observerパターンでデータストリームを扱うクラスには、次の2つのクラスが存在します。
クラス名 | 役目 | 略称 |
---|---|---|
Observable | データストリームを表現するクラス |
実行者
|
Observer | Observableからデータストリームを受け取るクラス | 監視者 |
実行者のことを「出版」、監視者のことを「購読」と呼ぶ場合もあります。少し古い言い方ですが、Observerパターンを出版-購読の関係になぞらえた言い方です。その場合の考え方は次の通りです。
- 出版社が事業を始め、定期的な刊行物を発行します。
- 購読者は、出版社に購読の申し込みをすると定期的に刊行物が届けられます。
- 購読を解除すると、解除日以降は刊行物は届けられません。
出版者が新聞や雑誌などの定期刊行物を発行し、それを誰でも好きなタイミングで購読したり辞めたりできることと同じように考えるものです。データストリームを監視するメソッドの名前がsubscribe(購読する)であり、出版-購読の考え方も仕様上はまだ残っているので、ここで軽く触れておきます。
Observerパターンで受け取れる通知
先にRxSwiftのObserverパターンで受け取れる通知について説明します。連載第1回でも説明した通り、RxSwiftでは通知を受け取った後に処理が走りますので、どのように通知されるのかを前もって知っておく必要があります。RxSwiftのドキュメントを参照すると、イベントについては列挙型で次のように定義されています。
enum Event<Element> { case next(Element) // next element of a sequence case error(Swift.Error) // sequence failed with error case completed // sequence terminated successfully }
それぞれのイベントの意味は次の通りです。
イベントの種別 | 発生するタイミング | 渡される値 |
---|---|---|
next(Element) | イベントが発生した際に何度でも |
イベント派生元の値(データストリーム)
|
error(Swift.Error) | エラーが発生した際に一度だけ | Swiftで扱われるエラー情報 |
completed | 処理が完了した際に一度だけ | なし |
イベントが発生した際には、そのイベントの発生によって生じた値を.nextで参照することができます。Int型/String型/配列/JSONなど値の型の種類に関わらず、値が変化した際にはその変化した後の値を通知によって全て受け取れるます。RxSwiftでイベントを購読した後は、通知以外に特別な処理は必要なく変化した値を参照できる非常にシンプルな仕組みであることがわかります。
エラーが発生した場合には、.errorでエラー情報が渡されます。エラーに関してはSwiftで利用できる一般的なエラーオブジェクトと定められており、こちらもエラーの際に特別なオブジェクトが必要ではないことがわかります。
処理が完結した際には、.completedで処理が完了したことが通知されます。完了の際の通知では、値やエラー情報は伴いません。
また、.errorと.completedが通知された後は処理は完了となり、その後に別の通知が来ることもありません。前回のマーブルダイアログの図で3つのイベントを表すと次の図のようになります。
RxSwiftではデータストリームを監視して得られるイベントはこの3種類であることを覚えておいてください。
監視可能なものを扱うObservableクラス
前項の3つのイベントを通知するオブジェクトは、Observableクラスで扱われます。文字通り監視可能/購読可能なものを扱うといった意味です。Observableクラスのイベントを受け取れるメソッドの1つにsubscribe(_:)メソッドというメソッドがあります。subscribe(_:)メソッドの書式とイメージは次の通りです。
#Observableオブジェクト#.subscribe( onNext: { 値 in 処理 }, onError: { エラー情報 in 処理 }, onCompleted: { 処理 } )
onNext/onError/onCompletedの後の処理が、それぞれObservableオブジェクトのnext(Element)/error(Swift.Error)/completedの通知に対応しています。onNext内ではイベントが発生した際の値/onError内にエラー情報が渡されます。{}内ではクロージャの形式で処理を記述します。
onNext/onError/onCompletedの各処理は必須ではなく、必要なものだけ記述できます。エラー発生時の処理のみを行いたい場合は、onErrorの処理のみを記述する、といった使い方ができます。
subscribe(_:)メソッドの戻り値はDisposableオブジェクトです。DisposableオブジェクトはObservableオブジェクトを利用する必要が無くなった際に、自動的にメモリを解放するオブジェクトです。