Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

RxSwiftの基本的な仕組みを理解しよう

RxSwiftで一歩進んだiOSアプリ開発 第2回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2018/09/12 14:00

 連載第2回となる今回は、RxSwiftの処理の基本的なデザインパターン「Observerパターン」を中心に、基本的な事柄を説明します。Observerパターンの考え方、Observerパターンで利用できる基本的なクラスの説明、UIを使った処理の3つについて、順を追ってサンプルを交えながら説明します。本連載では、これからRxSwiftを導入する方を対象読者としている関係上、RxSwift導入の初歩的な手順に関して主な説明を行います。そのため、便宜上クラス/メソッドの使い方が必ずしもRxSwiftの詳細な仕様通りでないこともあります。この点をご了承ください。

目次

はじめに

 RxSwiftを含めたRx全般において、処理の流れの基本的な設計として用いられるものの1つに、Observerパターンと呼ばれるデザインパターンがあります。デザインパターンとは、オブジェクト指向プログラミングの中で再利用可能な設計手法のことです。簡単に言うと、同じような処理方法のフォーマットを使いまわすことで、効率よくプログラムを組む設計手法の1つです。

 連載第1回で紹介した通り、RxSwiftでは処理のやり方が共通しているので、Observerパターンの考え方を理解することがRxSwiftを使いこなすための第一歩と言えます。

RxSwiftにおけるObserverパターン(1)

RxSwiftで採用されているObserverパターン

 Observerパターンとは、あるオブジェクトで発生したイベントを別のオブジェクト(オブザーバー)へ通知する処理で用いられるデザインパターンの1つです。

Observerパターンのイメージ
Observerパターンのイメージ

 別の見方をすると、オブジェクトを監視してイベントが発生した場合に、そこのことをオブザーバーへ通知するモデルとも言えます。

 RxSwiftで言うイベントとは、画面上で発生するタップイベントの他に、変数の値が変わった/APIから値が取得できたなどプログラム内におけるオブジェクトの状態の変化全てを指します。SwiftのUIControlEventなどよりも広い範囲を扱い、一般的なアプリ開発で指すSwift内のイベントよりも意味が大きいことに気をつけてください。

 RxSwiftでは、イベントストリームの中で流れて来るデータの部分をデータストリームと呼びます。Observerパターンでデータストリームを扱うクラスには、次の2つのクラスが存在します。

Observerパターンでデータストリームを扱うクラス
クラス名 役目   略称  
Observable データストリームを表現するクラス
実行者
Observer Observableからデータストリームを受け取るクラス 監視者
Observerパターンでデータストリームを扱うクラスの関係
Observerパターンでデータストリームを扱うクラスの関係

 実行者のことを「出版」、監視者のことを「購読」と呼ぶ場合もあります。少し古い言い方ですが、Observerパターンを出版-購読の関係になぞらえた言い方です。その場合の考え方は次の通りです。

  • 出版社が事業を始め、定期的な刊行物を発行します。
  • 購読者は、出版社に購読の申し込みをすると定期的に刊行物が届けられます。
  • 購読を解除すると、解除日以降は刊行物は届けられません。

 出版者が新聞や雑誌などの定期刊行物を発行し、それを誰でも好きなタイミングで購読したり辞めたりできることと同じように考えるものです。データストリームを監視するメソッドの名前がsubscribe(購読する)であり、出版-購読の考え方も仕様上はまだ残っているので、ここで軽く触れておきます。

Observerパターンで受け取れる通知

 先にRxSwiftのObserverパターンで受け取れる通知について説明します。連載第1回でも説明した通り、RxSwiftでは通知を受け取った後に処理が走りますので、どのように通知されるのかを前もって知っておく必要があります。RxSwiftのドキュメントを参照すると、イベントについては列挙型で次のように定義されています。

[リスト1]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
}

 それぞれのイベントの意味は次の通りです。

RxSwiftで通知されるイベントの種類
イベントの種別 発生するタイミング   渡される値  
next(Element)  イベントが発生した際に何度でも
イベント派生元の値(データストリーム)
error(Swift.Error) エラーが発生した際に一度だけ Swiftで扱われるエラー情報
completed 処理が完了した際に一度だけ なし

 イベントが発生した際には、そのイベントの発生によって生じた値を.nextで参照することができます。Int型/String型/配列/JSONなど値の型の種類に関わらず、値が変化した際にはその変化した後の値を通知によって全て受け取れるます。RxSwiftでイベントを購読した後は、通知以外に特別な処理は必要なく変化した値を参照できる非常にシンプルな仕組みであることがわかります。

 エラーが発生した場合には、.errorでエラー情報が渡されます。エラーに関してはSwiftで利用できる一般的なエラーオブジェクトと定められており、こちらもエラーの際に特別なオブジェクトが必要ではないことがわかります。

 処理が完結した際には、.completedで処理が完了したことが通知されます。完了の際の通知では、値やエラー情報は伴いません。

 また、.errorと.completedが通知された後は処理は完了となり、その後に別の通知が来ることもありません。前回のマーブルダイアログの図で3つのイベントを表すと次の図のようになります。

マーブルダイアログに配置した3つのイベント
マーブルダイアログに配置した3つのイベント

 RxSwiftではデータストリームを監視して得られるイベントはこの3種類であることを覚えておいてください。

監視可能なものを扱うObservableクラス

 前項の3つのイベントを通知するオブジェクトは、Observableクラスで扱われます。文字通り監視可能/購読可能なものを扱うといった意味です。Observableクラスのイベントを受け取れるメソッドの1つにsubscribe(_:)メソッドというメソッドがあります。subscribe(_:)メソッドの書式とイメージは次の通りです。

[リスト2]subscribe(_:)メソッドの書式
#Observableオブジェクト#.subscribe(
        onNext: { 値 in 処理 },
        onError: { エラー情報 in 処理 },
        onCompleted: { 処理 }
)
subscribe(_:)メソッドのイメージ
subscribe(_:)メソッドのイメージ

 onNext/onError/onCompletedの後の処理が、それぞれObservableオブジェクトのnext(Element)/error(Swift.Error)/completedの通知に対応しています。onNext内ではイベントが発生した際の値/onError内にエラー情報が渡されます。{}内ではクロージャの形式で処理を記述します。

 onNext/onError/onCompletedの各処理は必須ではなく、必要なものだけ記述できます。エラー発生時の処理のみを行いたい場合は、onErrorの処理のみを記述する、といった使い方ができます。

 subscribe(_:)メソッドの戻り値はDisposableオブジェクトです。DisposableオブジェクトはObservableオブジェクトを利用する必要が無くなった際に、自動的にメモリを解放するオブジェクトです。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2017年5月時点での登録メンバは52名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂き...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:RxSwiftで一歩進んだiOSアプリ開発
All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5