Top Banner
RxSwift x Realm 宇佐見 公輔 2015/9/29 Realm meetup #7
30

RxSwift x Realm

Jan 21, 2017

Download

Software

Kosuke Usami
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: RxSwift x Realm

RxSwift x Realm宇佐見 公輔

2015/9/29 Realm meetup #7

Page 2: RxSwift x Realm

自己紹介• 宇佐見 公輔 (@usamik26) • 大阪府堺市在住

• フェンリル株式会社 • アプリケーション共同開発部 • iOS アプリエンジニア

アドレスバーすら取り払った究極の先端的ブラウザ

Page 3: RxSwift x Realm

今日の内容• RxSwift の紹介

• RxSwift と Realm との連携

Page 4: RxSwift x Realm

RxSwift

Page 5: RxSwift x Realm
Page 6: RxSwift x Realm

Reactive Programming• イベントや値の関係を記述 • 一方の変化を他方に伝播 • メッセージ送信の隠蔽

• データバインディングは Reactive な仕組みの一種

Page 7: RxSwift x Realm

Functional Reactive Programming• 非同期データストリーム • 時間軸に沿って値が流れるリスト

• ストリームに対するリスト操作 • map や filter といった関数型のイディオム

Page 8: RxSwift x Realm

RP / FRP の利点• イベント駆動処理が書きやすい • 非同期処理が書きやすい

• したがって、GUI プログラミングと相性がよい

Page 9: RxSwift x Realm

Reactive Programming for iOS• ReactiveCocoa • ReactKit • RxSwift

• それぞれに良さがある

Page 10: RxSwift x Realm

ReactiveX ファミリー• Rx.NET (C#) • RxJS • RxJava • RxSwift

• ・・・など

Page 11: RxSwift x Realm

RxSwift 2.0• Swift 2 対応版 • バージョン 2.0.0-alpha.3 • iOS 7 以降(iOS 8 以降が望ましい)

• 基本的なところは十分使える状態 • 実案件で採用中

Page 12: RxSwift x Realm

RxSwift の実際

Page 13: RxSwift x Realm

RxSwift / RxCocoa• RxSwift • Observable / 各種 Operator / Scheduler など

• RxCocoa • UIKit / NSURLSession / KVO など

Page 14: RxSwift x Realm

Observable• 非同期データストリームをあらわす

Page 15: RxSwift x Realm

例:イベント処理button.rx_tap .subscribeNext { _ in // ボタンがタップされたときの処理 } .addDisposableTo(disposeBag)

Page 16: RxSwift x Realm

例:非同期処理URLSession.rx_response(request) .subscribeOn(sessionScheduler) .map { (data, response) in // バックグラウンド処理 } .observeOn(mainScheduler) .map { data in // UI処理 }

Page 17: RxSwift x Realm

例:ストリームをつくる:NSURLResponseの場合func rx_response(request: NSURLRequest) -> Observable<NSData!, NSURLResponse!> { return create { observer in // request を送信してレスポンスを受け取る if 失敗 { observer.on(.Error(error)) } else { observer.on(.Next(data, response)) observer.on(.Completed) } return AnonymousDisposable { /* キャンセル処理 */ } } }

Page 18: RxSwift x Realm

例:ストリームをつくる:別の手段let items = PublishSubject<Item>() // Observable<Item>

// データを流す items.on(.Next(item))

// 終了 items.on(.Completed)

// エラー終了 items.on(.Error(error))

Page 19: RxSwift x Realm

例:作ったストリームを使うitems .filter { _ in // 不要なデータを捨てる } .subscribeNext { _ in // データに対する処理 } .addDisposableTo(disposeBag)

Page 20: RxSwift x Realm

RxSwift x Realm

Page 21: RxSwift x Realm

Realm のデータ取得• Realm のクエリでもいいけど・・・

• Rx でデータを取得したい(Observable で扱いたい)

• DB アクセスと Rx の処理が混在すると厄介 • スレッドをまたぐ場合をどうする?

Page 22: RxSwift x Realm

RxJava のケースを参考にする

Page 23: RxSwift x Realm

モデルクラスを分ける• ひとつの対象に対して、ふたつのモデルクラスをつくる • Realm の Object 型のモデル • 非 Realm のモデル

• 冗長であることは否定できない・・・ • DB 用のモデルと View 用のモデル、と思えば許容範囲

Page 24: RxSwift x Realm

仲介役をつくる• RealmDataService • Realm のクエリから Results を得る • Realm の Results から View 用のモデルに変換 • View 用のモデルの Observable を出力

Page 25: RxSwift x Realm

Realm へのアクセス• RealmObservable • Realm へのアクセス処理を一箇所にまとめる

• (前述の RealmDataService で直接 Realm アクセスすることも可能だが、煩雑になる)

Page 26: RxSwift x Realm

使い方RealmDataService.items .map { item in // モデルの処理 } .addDisposableTo(disposeBag)

Page 27: RxSwift x Realm

Realm への書き込み• 同様の枠組みで書き込みにも対応できる

• RealmDataService にデータ作成 I/F を追加 • RealmObservable をトランザクションに対応

Page 28: RxSwift x Realm

まとめ

Page 29: RxSwift x Realm

まとめ• RxSwift の紹介 • RxSwift の実際

• RxSwift と Realm との連携 • 一工夫いれるとよい • Rx と Realm をちゃんと分けて考えるのがよい

Page 30: RxSwift x Realm