SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
RxSwift x Realm
宇佐見 公輔
2015/9/29 Realm meetup #7
自己紹介
• 宇佐見 公輔 (@usamik26)
• 大阪府堺市在住
• フェンリル株式会社
• アプリケーション共同開発部
• iOS アプリエンジニア
アドレスバーすら取り払った
究極の先端的ブラウザ
今日の内容
• RxSwift の紹介
• RxSwift と Realm との連携
RxSwift
Reactive Programming
• イベントや値の関係を記述
• 一方の変化を他方に伝播
• メッセージ送信の隠
• データバインディングは Reactive な仕組みの一種
Functional Reactive Programming
• 非同期データストリーム
• 時間軸に沿って値が流れるリスト
• ストリームに対するリスト操作
• map や filter といった関数型のイディオム
RP / FRP の利点
• イベント駆動処理が書きやすい
• 非同期処理が書きやすい
• したがって、GUI プログラミングと相性がよい
Reactive Programming for iOS
• ReactiveCocoa
• ReactKit
• RxSwift
• それぞれに良さがある
ReactiveX ファミリー
• Rx.NET (C#)
• RxJS
• RxJava
• RxSwift
• ・・・など
RxSwift 2.0
• Swift 2 対応版
• バージョン 2.0.0-alpha.3
• iOS 7 以降(iOS 8 以降が望ましい)
• 基本的なところは十分使える状態
• 実案件で採用中
RxSwift の実際
RxSwift / RxCocoa
• RxSwift
• Observable / 各種 Operator / Scheduler など
• RxCocoa
• UIKit / NSURLSession / KVO など
Observable
• 非同期データストリームをあらわす
例:イベント処理
button.rx_tap
.subscribeNext { _ in
// ボタンがタップされたときの処理
}
.addDisposableTo(disposeBag)
例:非同期処理
URLSession.rx_response(request)
.subscribeOn(sessionScheduler)
.map { (data, response) in
// バックグラウンド処理
}
.observeOn(mainScheduler)
.map { data in
// UI処理
}
例:ストリームをつくる: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 { /* キャンセル処理 */ }
}
}
例:ストリームをつくる:別の手段
let items = PublishSubject<Item>() // Observable<Item>
// データを流す
items.on(.Next(item))
// 終了
items.on(.Completed)
// エラー終了
items.on(.Error(error))
例:作ったストリームを使う
items
.filter { _ in
// 不要なデータを捨てる
}
.subscribeNext { _ in
// データに対する処理
}
.addDisposableTo(disposeBag)
RxSwift x Realm
Realm のデータ取得
• Realm のクエリでもいいけど・・・
• Rx でデータを取得したい(Observable で扱いたい)
• DB アクセスと Rx の処理が混在すると厄介
• スレッドをまたぐ場合をどうする?
RxJava のケースを参考にする
モデルクラスを分ける
• ひとつの対象に対して、ふたつのモデルクラスをつくる
• Realm の Object 型のモデル
• 非 Realm のモデル
• 冗長であることは否定できない・・・
• DB 用のモデルと View 用のモデル、と思えば許容範囲
仲介役をつくる
• RealmDataService
• Realm のクエリから Results を得る
• Realm の Results から View 用のモデルに変換
• View 用のモデルの Observable を出力
Realm へのアクセス
• RealmObservable
• Realm へのアクセス処理を一箇所にまとめる
• (前述の RealmDataService で直接 Realm アクセス
することも可能だが、煩雑になる)
使い方
RealmDataService.items
.map { item in
// モデルの処理
}
.addDisposableTo(disposeBag)
Realm への書き込み
• 同様の枠組みで書き込みにも対応できる
• RealmDataService にデータ作成 I/F を追加
• RealmObservable をトランザクションに対応
まとめ
まとめ
• RxSwift の紹介
• RxSwift の実際
• RxSwift と Realm との連携
• 一工夫いれるとよい
• Rx と Realm をちゃんと分けて考えるのがよい
RxSwift x Realm

Contenu connexe

Tendances

大規模ログ集約実現のためのアーキテクチャ
大規模ログ集約実現のためのアーキテクチャ大規模ログ集約実現のためのアーキテクチャ
大規模ログ集約実現のためのアーキテクチャYugo Shimizu
 
IBM Cloud 使ってタスク管理(JIRA Software)を運用してみた。
IBM Cloud 使ってタスク管理(JIRA Software)を運用してみた。IBM Cloud 使ってタスク管理(JIRA Software)を運用してみた。
IBM Cloud 使ってタスク管理(JIRA Software)を運用してみた。Kohei Nishikawa
 
grpc-gateway を試してみた fukuoka.go#11
grpc-gateway を試してみた fukuoka.go#11grpc-gateway を試してみた fukuoka.go#11
grpc-gateway を試してみた fukuoka.go#11Yutaka Tachibana
 
Redux, Relay, HorizonあるいはElm
Redux, Relay, HorizonあるいはElmRedux, Relay, HorizonあるいはElm
Redux, Relay, HorizonあるいはElmchuck h
 
AliEaters meetup#1 ド派手ダッシュボードDataVで遊んでみよう
AliEaters meetup#1 ド派手ダッシュボードDataVで遊んでみようAliEaters meetup#1 ド派手ダッシュボードDataVで遊んでみよう
AliEaters meetup#1 ド派手ダッシュボードDataVで遊んでみようShinya Mori (@mosuke5)
 
クラウド環境でのロギングと、AlibabaCloudでのロギングソリューション
クラウド環境でのロギングと、AlibabaCloudでのロギングソリューションクラウド環境でのロギングと、AlibabaCloudでのロギングソリューション
クラウド環境でのロギングと、AlibabaCloudでのロギングソリューションShinya Mori (@mosuke5)
 
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda20150908 ”時間の流れ” という無限リストを扱うAWS Lambda
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda都元ダイスケ Miyamoto
 
Reactive Systems と Back Pressure
Reactive Systems と Back PressureReactive Systems と Back Pressure
Reactive Systems と Back PressureAkihiro Ikezoe
 
Alibaba Cloud Serverless
Alibaba Cloud ServerlessAlibaba Cloud Serverless
Alibaba Cloud Serverless真吾 吉田
 
俺とサーバレスアーキテクチャ Aws cognito + aws api gateway 編
俺とサーバレスアーキテクチャ Aws cognito + aws api gateway 編俺とサーバレスアーキテクチャ Aws cognito + aws api gateway 編
俺とサーバレスアーキテクチャ Aws cognito + aws api gateway 編Masayuki KaToH
 
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築Masashi Shinbara
 
API Gatewayで re:Inventのセッション探し
API Gatewayで re:Inventのセッション探しAPI Gatewayで re:Inventのセッション探し
API Gatewayで re:Inventのセッション探しRyo Nakamaru
 
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポート
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポートJAWS-UGアーキテクチャ専門支部 ServerlessConfレポート
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポート真吾 吉田
 
Serverless apps on aws using scala
Serverless apps on aws using scalaServerless apps on aws using scala
Serverless apps on aws using scalaYoshitaka Fujii
 
Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装Sugawara Genki
 
第5回Sql server2017勉強会資料
第5回Sql server2017勉強会資料第5回Sql server2017勉強会資料
第5回Sql server2017勉強会資料TakenoriIijima
 
Architecting on Alibaba Cloud - 超基礎編 -
Architecting on Alibaba Cloud - 超基礎編 -Architecting on Alibaba Cloud - 超基礎編 -
Architecting on Alibaba Cloud - 超基礎編 -真吾 吉田
 

Tendances (20)

大規模ログ集約実現のためのアーキテクチャ
大規模ログ集約実現のためのアーキテクチャ大規模ログ集約実現のためのアーキテクチャ
大規模ログ集約実現のためのアーキテクチャ
 
IBM Cloud 使ってタスク管理(JIRA Software)を運用してみた。
IBM Cloud 使ってタスク管理(JIRA Software)を運用してみた。IBM Cloud 使ってタスク管理(JIRA Software)を運用してみた。
IBM Cloud 使ってタスク管理(JIRA Software)を運用してみた。
 
Devfes kyoto2017
Devfes kyoto2017Devfes kyoto2017
Devfes kyoto2017
 
grpc-gateway を試してみた fukuoka.go#11
grpc-gateway を試してみた fukuoka.go#11grpc-gateway を試してみた fukuoka.go#11
grpc-gateway を試してみた fukuoka.go#11
 
Redux, Relay, HorizonあるいはElm
Redux, Relay, HorizonあるいはElmRedux, Relay, HorizonあるいはElm
Redux, Relay, HorizonあるいはElm
 
Rx Showcase
Rx ShowcaseRx Showcase
Rx Showcase
 
AliEaters meetup#1 ド派手ダッシュボードDataVで遊んでみよう
AliEaters meetup#1 ド派手ダッシュボードDataVで遊んでみようAliEaters meetup#1 ド派手ダッシュボードDataVで遊んでみよう
AliEaters meetup#1 ド派手ダッシュボードDataVで遊んでみよう
 
クラウド環境でのロギングと、AlibabaCloudでのロギングソリューション
クラウド環境でのロギングと、AlibabaCloudでのロギングソリューションクラウド環境でのロギングと、AlibabaCloudでのロギングソリューション
クラウド環境でのロギングと、AlibabaCloudでのロギングソリューション
 
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda20150908 ”時間の流れ” という無限リストを扱うAWS Lambda
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda
 
Reactive
ReactiveReactive
Reactive
 
Reactive Systems と Back Pressure
Reactive Systems と Back PressureReactive Systems と Back Pressure
Reactive Systems と Back Pressure
 
Alibaba Cloud Serverless
Alibaba Cloud ServerlessAlibaba Cloud Serverless
Alibaba Cloud Serverless
 
俺とサーバレスアーキテクチャ Aws cognito + aws api gateway 編
俺とサーバレスアーキテクチャ Aws cognito + aws api gateway 編俺とサーバレスアーキテクチャ Aws cognito + aws api gateway 編
俺とサーバレスアーキテクチャ Aws cognito + aws api gateway 編
 
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
 
API Gatewayで re:Inventのセッション探し
API Gatewayで re:Inventのセッション探しAPI Gatewayで re:Inventのセッション探し
API Gatewayで re:Inventのセッション探し
 
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポート
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポートJAWS-UGアーキテクチャ専門支部 ServerlessConfレポート
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポート
 
Serverless apps on aws using scala
Serverless apps on aws using scalaServerless apps on aws using scala
Serverless apps on aws using scala
 
Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装
 
第5回Sql server2017勉強会資料
第5回Sql server2017勉強会資料第5回Sql server2017勉強会資料
第5回Sql server2017勉強会資料
 
Architecting on Alibaba Cloud - 超基礎編 -
Architecting on Alibaba Cloud - 超基礎編 -Architecting on Alibaba Cloud - 超基礎編 -
Architecting on Alibaba Cloud - 超基礎編 -
 

Similaire à RxSwift x Realm

Realm,rx swift,repro を使ってみて
Realm,rx swift,repro を使ってみてRealm,rx swift,repro を使ってみて
Realm,rx swift,repro を使ってみてDaisuke Nagata
 
GraphQLはどんな時に使うか
GraphQLはどんな時に使うかGraphQLはどんな時に使うか
GraphQLはどんな時に使うかYutaka Tachibana
 
20141122 デジコミュ秋田 WordPressサイト永代供養の儀
20141122 デジコミュ秋田 WordPressサイト永代供養の儀20141122 デジコミュ秋田 WordPressサイト永代供養の儀
20141122 デジコミュ秋田 WordPressサイト永代供養の儀Seiji Akatsuka
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.jsTanUkkii
 
Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築ryosuke matsumura
 
20110305_Code4Lib2011参加報告会:田辺浩介参加報告
20110305_Code4Lib2011参加報告会:田辺浩介参加報告20110305_Code4Lib2011参加報告会:田辺浩介参加報告
20110305_Code4Lib2011参加報告会:田辺浩介参加報告Code4Lib JAPAN
 
Rxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようRxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようFumihiko Shiroyama
 
Going Serverless, Building Applications with No Servers
Going Serverless, Building Applications with No ServersGoing Serverless, Building Applications with No Servers
Going Serverless, Building Applications with No ServersKeisuke Nishitani
 
201910 azure seminar
201910 azure seminar201910 azure seminar
201910 azure seminarSAKURUG co.
 
JavaからScalaへ
JavaからScalaへJavaからScalaへ
JavaからScalaへtakezoe
 
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能Takuya Iwatsuka
 
Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築ryosuke matsumura
 
Aiming飲み会 1-rails における
コネクション数と
シャーディングのお話
Aiming飲み会 1-rails における
コネクション数と
シャーディングのお話Aiming飲み会 1-rails における
コネクション数と
シャーディングのお話
Aiming飲み会 1-rails における
コネクション数と
シャーディングのお話Hidenori Doi
 
UnityとAmazon Web Servicesで生み出す新しい価値
UnityとAmazon Web Servicesで生み出す新しい価値UnityとAmazon Web Servicesで生み出す新しい価値
UnityとAmazon Web Servicesで生み出す新しい価値Keisuke Nishitani
 
Java scriptの進化
Java scriptの進化Java scriptの進化
Java scriptの進化maruyama097
 
Rails5 Action Cableの紹介
Rails5 Action Cableの紹介Rails5 Action Cableの紹介
Rails5 Action Cableの紹介pro0901
 

Similaire à RxSwift x Realm (20)

Realm,rx swift,repro を使ってみて
Realm,rx swift,repro を使ってみてRealm,rx swift,repro を使ってみて
Realm,rx swift,repro を使ってみて
 
GraphQLはどんな時に使うか
GraphQLはどんな時に使うかGraphQLはどんな時に使うか
GraphQLはどんな時に使うか
 
20141122 デジコミュ秋田 WordPressサイト永代供養の儀
20141122 デジコミュ秋田 WordPressサイト永代供養の儀20141122 デジコミュ秋田 WordPressサイト永代供養の儀
20141122 デジコミュ秋田 WordPressサイト永代供養の儀
 
Rx入門
Rx入門Rx入門
Rx入門
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築
 
20110305_Code4Lib2011参加報告会:田辺浩介参加報告
20110305_Code4Lib2011参加報告会:田辺浩介参加報告20110305_Code4Lib2011参加報告会:田辺浩介参加報告
20110305_Code4Lib2011参加報告会:田辺浩介参加報告
 
Growing up serverless
Growing up serverlessGrowing up serverless
Growing up serverless
 
Rxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようRxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしよう
 
Going Serverless, Building Applications with No Servers
Going Serverless, Building Applications with No ServersGoing Serverless, Building Applications with No Servers
Going Serverless, Building Applications with No Servers
 
201910 azure seminar
201910 azure seminar201910 azure seminar
201910 azure seminar
 
JavaからScalaへ
JavaからScalaへJavaからScalaへ
JavaからScalaへ
 
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
 
Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築
 
Aiming飲み会 1-rails における
コネクション数と
シャーディングのお話
Aiming飲み会 1-rails における
コネクション数と
シャーディングのお話Aiming飲み会 1-rails における
コネクション数と
シャーディングのお話
Aiming飲み会 1-rails における
コネクション数と
シャーディングのお話
 
UnityとAmazon Web Servicesで生み出す新しい価値
UnityとAmazon Web Servicesで生み出す新しい価値UnityとAmazon Web Servicesで生み出す新しい価値
UnityとAmazon Web Servicesで生み出す新しい価値
 
Java scriptの進化
Java scriptの進化Java scriptの進化
Java scriptの進化
 
Serverless for VUI
Serverless for VUIServerless for VUI
Serverless for VUI
 
Scim and or graph
Scim and or graphScim and or graph
Scim and or graph
 
Rails5 Action Cableの紹介
Rails5 Action Cableの紹介Rails5 Action Cableの紹介
Rails5 Action Cableの紹介
 

Plus de Kosuke Usami

View 系ライブラリに関する悩み
View 系ライブラリに関する悩みView 系ライブラリに関する悩み
View 系ライブラリに関する悩みKosuke Usami
 
Xamarin で Apple Watch アプリを作る
Xamarin で Apple Watch アプリを作るXamarin で Apple Watch アプリを作る
Xamarin で Apple Watch アプリを作るKosuke Usami
 
iBeacon Applications
iBeacon ApplicationsiBeacon Applications
iBeacon ApplicationsKosuke Usami
 
JXUG Conference 2 West
JXUG Conference 2 WestJXUG Conference 2 West
JXUG Conference 2 WestKosuke Usami
 
すごいHaskell読書会
すごいHaskell読書会すごいHaskell読書会
すごいHaskell読書会Kosuke Usami
 
Semantic Versioning
Semantic VersioningSemantic Versioning
Semantic VersioningKosuke Usami
 
Mac アプリの Retina 対応
Mac アプリの Retina 対応Mac アプリの Retina 対応
Mac アプリの Retina 対応Kosuke Usami
 
Mountain Lion Sharing Service
Mountain Lion Sharing ServiceMountain Lion Sharing Service
Mountain Lion Sharing ServiceKosuke Usami
 
OS X LionのVersions対応
OS X LionのVersions対応OS X LionのVersions対応
OS X LionのVersions対応Kosuke Usami
 

Plus de Kosuke Usami (17)

SnapKit
SnapKitSnapKit
SnapKit
 
View 系ライブラリに関する悩み
View 系ライブラリに関する悩みView 系ライブラリに関する悩み
View 系ライブラリに関する悩み
 
Auto Layout Tips
Auto Layout TipsAuto Layout Tips
Auto Layout Tips
 
Eddystone Beacon
Eddystone BeaconEddystone Beacon
Eddystone Beacon
 
Xamarin で Apple Watch アプリを作る
Xamarin で Apple Watch アプリを作るXamarin で Apple Watch アプリを作る
Xamarin で Apple Watch アプリを作る
 
iBeacon Applications
iBeacon ApplicationsiBeacon Applications
iBeacon Applications
 
APIKit
APIKitAPIKit
APIKit
 
Swift Library
Swift LibrarySwift Library
Swift Library
 
JXUG Conference 2 West
JXUG Conference 2 WestJXUG Conference 2 West
JXUG Conference 2 West
 
すごいHaskell読書会
すごいHaskell読書会すごいHaskell読書会
すごいHaskell読書会
 
Xamarin.iOS
Xamarin.iOSXamarin.iOS
Xamarin.iOS
 
CotEditor Script
CotEditor ScriptCotEditor Script
CotEditor Script
 
Affine Transform
Affine TransformAffine Transform
Affine Transform
 
Semantic Versioning
Semantic VersioningSemantic Versioning
Semantic Versioning
 
Mac アプリの Retina 対応
Mac アプリの Retina 対応Mac アプリの Retina 対応
Mac アプリの Retina 対応
 
Mountain Lion Sharing Service
Mountain Lion Sharing ServiceMountain Lion Sharing Service
Mountain Lion Sharing Service
 
OS X LionのVersions対応
OS X LionのVersions対応OS X LionのVersions対応
OS X LionのVersions対応
 

RxSwift x Realm