SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

Observableオブジェクトを生成する

 前項で触れた、監視可能なObservableオブジェクトを生成する方法について解説します。説明は次節以降になりますが、RxSwiftではUIなどからすぐに利用できるObservableも存在し、RxSwiftの導入当初は開発者自身がObservableを生成して利用することは少ないです。ここでは、Observableオブジェクトを生成する方法を簡単に説明します。Observableオブジェクトを生成するメソッドには、次のものがあります。

Observableオブジェクトを生成する主なクラスメソッド
of  一定数の要素でObservableを作成
from 配列/辞書/集合などからObservableを作成
create Observableをゼロから作成
never イベントを終了しないObservableを作成
empty completedイベントのみを発生するObservableを作成

 String型の値を持つObservableオブジェクトは、ofメソッドを利用して次の通り生成できます。

[リスト3]ViewController.swift
let helloObservable : Observable<String> = Observable.from(["H","e","l","l","o"])

 Stringの値は"H","e","l","l","o"の順番で変わります。生成したObservableオブジェクトをsubscribe(_:)メソッドを利用して監視する処理は次のように記述できます。

[リスト4]ViewController.swift
// Observableを生成
let helloObservable : Observable<String> = Observable.from(["H","e","l","l","o"])
// 監視
let subscription = helloObservable.subscribe(    // -------(1)
    onNext: { value in print(value) },
    onError: { error in print(error.localizedDescription) },
    onCompleted: { print("completed") }
)
// 完了時に解放
let disposeBag = DisposeBag()    // -------(2)
subscription.disposed(by: disposeBag)

 (1)subscribe(_:)メソッドでonNext/onError/onCompletedの処理を指定してObservableオブジェクトを監視します。onNextで変化した値を出力、エラー発生時にはエラー内容を出力、完了時には「completed」を出力します。

 (2)subscribe(_:)メソッドの戻り値のDisposableオブジェクトをdisposed(by: )メソッドで解放します。その際に廃棄フラグ的な役目を果たすDisposeBagオブジェクトを渡します。DisposeBagオブジェクトは同じものを使いまわすことができますので、ビューコントローラーの上部で生成しておいても構いません。

 サンプルを実行すると、次の通り変化したStringの値が順番に表示され、最後に「completed」が出力されます。

[リスト5]helloObservableオブジェクトの監視結果
H
e
l
l
o
completed

 Stringの値が変わった場合と処理が完了した場合に各イベントが発生し、通知されていることがわかります。実行中にエラーが発生した場合は、そのエラー内容が表示されます。

 Observableオブジェクトでは、メソッドを連続して記述するメソッドチェーンの記述も利用できます。メソッドチェーンを利用するとサンプルは次の通り記述することが可能です。

[リスト6]ViewController.swift
helloObservable.subscribe( 
    onNext: { value in print(value) },
    onError: { error in print(error.localizedDescription) },
    onCompleted: { print("completed") }
).disposed(by: disposeBag)

 subscribe(_:)メソッドの戻り値であるDisposableオブジェクトはオブジェクトの解放以外に利用しないので、変数に代入せずに続けてdisposed(by: )メソッドを記述しています。

 また、Observableクラスは次のObserverTypeプロトコルを実装しています。

[リスト7]ObserverTypeプロトコルの定義
protocol ObserverType {
    func on(_ event: Event<Element>)
}

 プロトコルの書式の通り、on(_:)メソッド内でイベントを指定することでnext(Element)/error(Swift.Error)/completedの各イベントで何をするか定義してObservableを生成することも可能です。

[リスト8]ViewController.swift
let exampleObservable : Observable<String> = Observable.create { (observer) in
    observer.on(.next("Hello"))
    observer.on(.completed)
    observer.onError(NSError(domain: "My Observable Error", code: -1, userInfo: nil))
    return Disposables.create()
}

 各イベントを定義した後に、購読を解除するDisposableオブジェクトを返却します。作成したexampleObservableオブジェクトも前のサンプルと同様にsubscribe(_:)メソッドで動作確認できます。

[リスト9]ViewController.swift
exampleObservable.subscribe(
    onNext: { print($0) },
    onError: { print($0.localizedDescription) },
    onCompleted: { print("completed") }
).disposed(by: disposeBag)

// 実行結果「Hello」「completed」 を出力

 onNext/onErrorのクロージャ内に渡される値は、記述を省略して上記のように「$0」で取得できます。簡単なサンプルですが、Observableオブジェクトの生成と確認はこのようにして行います。開発者自身がObservableオブジェクトを生成するケースは、APIからのJSONの取得やDBからの値の取得など非同期で実行され、かつエラーが起きる可能性がある場合などによく利用されます。

次のページ
UIを利用してRxSwiftのサンプルを確認する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
RxSwiftで一歩進んだiOSアプリ開発連載記事一覧

もっと読む

この記事の著者

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11051 2018/09/12 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング