SlideShare una empresa de Scribd logo
1 de 31
AWA with Realm (iOS)
波戸 勇二 [Yuji Hato]
INTRODUCTION
自己紹介
System EngineerとしてSIerを経て、2011年サ
イバーエージェントに入社。
複数のAmebaサービスにて、サーバサイド
/Android/iOSを担当し、現在はAWAのiOSエン
ジニア。
Engineer
Twitter https://twitter.com/dekatotoro
GitHub https://github.com/dekatotoro
今日は
Realmに関しての使い方やTipsは様々な方が紹
介しているので、Realmを使ったアプリケーシ
ョン全体の設計の紹介をします
Agenda
・Realmを使う目的
・Application Architecture
・なぜRealmか
・AWAとは
・Coding Topics
・Other Topics
洋楽・邦楽問わず、いつでもどこでも好きなだけ楽しむことができ
る
月額定額制の音楽ストリーミングサービス
なぜRealmか
なぜRealmか
なぜRealmか
・モデル/リレーションがクラス定義でらく
・パフォーマンスがよい
・クロスプラットフォームでAndroid
同じ設計ができる
・Realm使ってるとかっこよさそう
・ドキュメントの充実 & サポート
Realmを使う目的
Realmを使う目的
・ストレスフリーなUI/UXの実現
Application Architecture
サーバー
クライアント
クライアントとサーバ
のデータ同期
Application Architecture
サーバー
クライアント
Dataの差分更新/
変更チェック
Application Architecture
差分のみ
サーバー
クライアント
オンデマンド保存
Application Architecture
必要になったら
取得
Application Design
そのまえに…
Application Design
API Server
RealmView ViewController Service
Models
Modelの定義
Models
@interface EntityHoge : RLMObject
@property NSString *hogeId;
@property NSString *name;
@property NSInteger updatedAt;
@property NSInteger storedAt;
// Finders
+ (EntityHoge *) findById: (NSString *) hogeId;
@end
@implementation EntityHoge
+ (NSString *)primaryKey {
return @"hogeId";
}
+ (EntityHoge *) findById:(NSString *)hogeId {
RLMRealm *realm = [RealmManager realm];
EntityHoge *hoge = [self objectInRealm:realm forPrimaryKey:hogeId];
return hoge;
}
@end
ModelクラスにFinderなども定義しておくと便利。
Service
RealmObjectを扱うServiceを定義
Service
@implementation HogeService
- (EntityHoge *)read: (NSString *)hogeId
{
[[RealmManager realm] refresh];
return [EntityHoge findById:hogeId];
}
- (BFTask *)fetch:(NSString *)hogeId
withModifiedSince:(NSInteger)modifiedSince
{
return [[APIClient hogeData:hogeId modifiedSince:modifiedSince] continueWithExecutor:[RealmManager writeExecutor]
withSuccessBlock:^id(BFTask *task) {
// APIの戻りをチェックして差分をRealmに書き込み
EntityHoge *hoge = [DataConverter toHoge:task.result];
[RealmManager commit:^(RLMRealm *realm) {
[realm addOrUpdateObject:hoge];
}];
}];
}
@end
Serviceにread、fetchなど決まったIFを用意することで扱いやすくなる。
更新日時を渡すことでAPIからは変更/差分データのみを取得してRealmに保存。
readはスレッドを跨ぐことを考慮して毎回refreshを呼び出してから取得。
ViewController
ViewControllerからはServiceを通して
Realmを操作
ViewController
@property (nonatomic, strong) EntityHoge *hoge;
- (void)loadFromRealm {
self.hoge = [[HogeService shared] read:self.hogeId];
if (!self.hoge) {
// no cache
return;
}
// Show cache
}
- (void)loadFromAPI {
NSInteger modifiedSince = (self.hoge) ? self.hoge.updatedAt : 0;
[[[HogeService sharedService] fetch:self.hogeId withModifiedSince:modifiedSince]
continueWithExecutor:[BFExecutor mainThreadExecutor] withBlock:^id(BFTask *task) {
// Realmから取得し直してViewを更新
[self loadFromRealm];
return nil;
}];
}
Realmにデータがある場合は、APIに変更日を渡して変更/差分データのみ取得して
更新があったデータのみViewを更新する。
Boltsは非同期処理をメソッドチェーンで記述でき、Threadも指定できるのでRealm
を扱いやすい。Notificationは使ってない。
Other Topics
RLMRealm
Realmのpath、初期化、Realmインスタンスの取得、Migration、Write用スレッ
ドqueue取得などはwrapper classを作って纏めておくとよい
…
+ (void)prepareRealms {
static dispatch_once_t once;
dispatch_once(&once, ^{
defaultDataPath = [RealmManager dataRealmPath:kRealmDataFileName];
defaultCachePath = [RealmManager cacheRealmPath:kRealmCacheFileName];
[RLMRealm setDefaultRealmPath:defaultCachePath];
[RLMRealm setDefaultRealmSchemaVersion:kCurrentSchemeVersion
withMigrationBlock:^(RLMMigration *migration, uint64_t oldSchemaVersion) {
}];
[RLMRealm defaultRealm];
});
}
+ (RLMRealm *) realm {
return [RLMRealm defaultRealm];
}
…
Notifications
Realmのデータ変更時に処理ができますが
Notificationsの詳細情報がないので、きめ細や
かなUI制御ができないため使っていない
@property(nonatomic, strong) RLMNotificationToken *token;
…
self.token = [[LVPRealms realm] addNotificationBlock:^(NSString *note, RLMRealm * realm) {
// updateUI
}];
Migration
テーブル再構築処理かかないといけないので、
モデルが大幅に変更になるような場合はつらい
…
今のところSchemaVersion上げるだけで済んで
いる
Compaction
メモリ系のCrashログが増加してきたので中間
テーブルの肥大化を懸念
1日以上経っていたらCompactionを実行している
まとめ
・複雑なデータを大量に扱うアプリでキャッ
シュ用途として相性が良い
・Realm と Bolts は意外に相性がよい
・クライアントにデータ保存する場合は
サーバ含めたアプリケーション全体の
設計が大事
・Realmチームのサポートが厚い
THANK YOU!

Más contenido relacionado

Similar a AWA with Realm

愛せよ、さもなくば捨てよ。
愛せよ、さもなくば捨てよ。愛せよ、さもなくば捨てよ。
愛せよ、さもなくば捨てよ。Sho Yoshida
 
[db tech showcase Tokyo 2016] B15: サイバーエージェント アドテクスタジオの次世代データ分析基盤紹介 by 株式会社サイ...
[db tech showcase Tokyo 2016] B15: サイバーエージェント アドテクスタジオの次世代データ分析基盤紹介 by 株式会社サイ...[db tech showcase Tokyo 2016] B15: サイバーエージェント アドテクスタジオの次世代データ分析基盤紹介 by 株式会社サイ...
[db tech showcase Tokyo 2016] B15: サイバーエージェント アドテクスタジオの次世代データ分析基盤紹介 by 株式会社サイ...Insight Technology, Inc.
 
なるほどわかった!平成最後のAzureとAppService編
なるほどわかった!平成最後のAzureとAppService編なるほどわかった!平成最後のAzureとAppService編
なるほどわかった!平成最後のAzureとAppService編Takayuki Fuwa
 
Google Tangoで 現実世界を感じてみよう
Google Tangoで現実世界を感じてみようGoogle Tangoで現実世界を感じてみよう
Google Tangoで 現実世界を感じてみよう聡 大久保
 
ネイティブ機能を利用する Webアプリの実例 ~PhoneGap×Rails~
ネイティブ機能を利用するWebアプリの実例~PhoneGap×Rails~ネイティブ機能を利用するWebアプリの実例~PhoneGap×Rails~
ネイティブ機能を利用する Webアプリの実例 ~PhoneGap×Rails~Daisuke Futatsumori
 
#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ
#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ
#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチKazuya Sugimoto
 
Serverless Framework 使ってる話(node.js)
Serverless Framework 使ってる話(node.js)Serverless Framework 使ってる話(node.js)
Serverless Framework 使ってる話(node.js)Naoto Teruya
 
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」Serverworks Co.,Ltd.
 
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~SEGADevTech
 
SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!Kazumi IWANAGA
 
2015/11/15 Javaでwebアプリケーション入門
2015/11/15 Javaでwebアプリケーション入門2015/11/15 Javaでwebアプリケーション入門
2015/11/15 Javaでwebアプリケーション入門Asami Abe
 
2014-07-26 jawsug-chiba ドキュメントを書こう! 運用自動化時代のドキュメンテーション
2014-07-26 jawsug-chiba ドキュメントを書こう! 運用自動化時代のドキュメンテーション2014-07-26 jawsug-chiba ドキュメントを書こう! 運用自動化時代のドキュメンテーション
2014-07-26 jawsug-chiba ドキュメントを書こう! 運用自動化時代のドキュメンテーションOperation Lab, LLC.
 
わかると楽しいInfrastructure as code
わかると楽しいInfrastructure as codeわかると楽しいInfrastructure as code
わかると楽しいInfrastructure as codeShohei Kobayashi
 

Similar a AWA with Realm (20)

愛せよ、さもなくば捨てよ。
愛せよ、さもなくば捨てよ。愛せよ、さもなくば捨てよ。
愛せよ、さもなくば捨てよ。
 
[db tech showcase Tokyo 2016] B15: サイバーエージェント アドテクスタジオの次世代データ分析基盤紹介 by 株式会社サイ...
[db tech showcase Tokyo 2016] B15: サイバーエージェント アドテクスタジオの次世代データ分析基盤紹介 by 株式会社サイ...[db tech showcase Tokyo 2016] B15: サイバーエージェント アドテクスタジオの次世代データ分析基盤紹介 by 株式会社サイ...
[db tech showcase Tokyo 2016] B15: サイバーエージェント アドテクスタジオの次世代データ分析基盤紹介 by 株式会社サイ...
 
なるほどわかった!平成最後のAzureとAppService編
なるほどわかった!平成最後のAzureとAppService編なるほどわかった!平成最後のAzureとAppService編
なるほどわかった!平成最後のAzureとAppService編
 
Hue勉強会 20131008
Hue勉強会 20131008Hue勉強会 20131008
Hue勉強会 20131008
 
Google Tangoで 現実世界を感じてみよう
Google Tangoで現実世界を感じてみようGoogle Tangoで現実世界を感じてみよう
Google Tangoで 現実世界を感じてみよう
 
ネイティブ機能を利用する Webアプリの実例 ~PhoneGap×Rails~
ネイティブ機能を利用するWebアプリの実例~PhoneGap×Rails~ネイティブ機能を利用するWebアプリの実例~PhoneGap×Rails~
ネイティブ機能を利用する Webアプリの実例 ~PhoneGap×Rails~
 
Archer
ArcherArcher
Archer
 
Googleアシスタントアプリ実際のところ
Googleアシスタントアプリ実際のところ Googleアシスタントアプリ実際のところ
Googleアシスタントアプリ実際のところ
 
Webdb2011 hadoop
Webdb2011 hadoopWebdb2011 hadoop
Webdb2011 hadoop
 
#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ
#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ
#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ
 
Serverless Framework 使ってる話(node.js)
Serverless Framework 使ってる話(node.js)Serverless Framework 使ってる話(node.js)
Serverless Framework 使ってる話(node.js)
 
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
 
React way at_eight
React way at_eightReact way at_eight
React way at_eight
 
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
 
App shortcuts
App shortcutsApp shortcuts
App shortcuts
 
SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!
 
P5sound
P5soundP5sound
P5sound
 
2015/11/15 Javaでwebアプリケーション入門
2015/11/15 Javaでwebアプリケーション入門2015/11/15 Javaでwebアプリケーション入門
2015/11/15 Javaでwebアプリケーション入門
 
2014-07-26 jawsug-chiba ドキュメントを書こう! 運用自動化時代のドキュメンテーション
2014-07-26 jawsug-chiba ドキュメントを書こう! 運用自動化時代のドキュメンテーション2014-07-26 jawsug-chiba ドキュメントを書こう! 運用自動化時代のドキュメンテーション
2014-07-26 jawsug-chiba ドキュメントを書こう! 運用自動化時代のドキュメンテーション
 
わかると楽しいInfrastructure as code
わかると楽しいInfrastructure as codeわかると楽しいInfrastructure as code
わかると楽しいInfrastructure as code
 

Más de Yuji Hato

継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」
継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」
継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」Yuji Hato
 
Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
Adaptive UI  - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ - Adaptive UI  - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ - Yuji Hato
 
iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術Yuji Hato
 
5分で学ぶ差分更新とRxDataSources
5分で学ぶ差分更新とRxDataSources5分で学ぶ差分更新とRxDataSources
5分で学ぶ差分更新とRxDataSourcesYuji Hato
 
AbemaTV モバイルアプリの開発体制と開発プロセスの話
AbemaTV モバイルアプリの開発体制と開発プロセスの話AbemaTV モバイルアプリの開発体制と開発プロセスの話
AbemaTV モバイルアプリの開発体制と開発プロセスの話Yuji Hato
 
Apple TV tvOS入門 Iosdc2017
Apple TV tvOS入門 Iosdc2017Apple TV tvOS入門 Iosdc2017
Apple TV tvOS入門 Iosdc2017Yuji Hato
 
AbemaTV on tvOS
AbemaTV on tvOSAbemaTV on tvOS
AbemaTV on tvOSYuji Hato
 
Flux with RxSwift
Flux with RxSwiftFlux with RxSwift
Flux with RxSwiftYuji Hato
 
CarPlayの対応方法と日本での現状
CarPlayの対応方法と日本での現状CarPlayの対応方法と日本での現状
CarPlayの対応方法と日本での現状Yuji Hato
 

Más de Yuji Hato (9)

継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」
継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」
継続的な開発スタイル 「AbemaTV iOSアプリを週一でリリースしている話」
 
Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
Adaptive UI  - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ - Adaptive UI  - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
 
iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術
 
5分で学ぶ差分更新とRxDataSources
5分で学ぶ差分更新とRxDataSources5分で学ぶ差分更新とRxDataSources
5分で学ぶ差分更新とRxDataSources
 
AbemaTV モバイルアプリの開発体制と開発プロセスの話
AbemaTV モバイルアプリの開発体制と開発プロセスの話AbemaTV モバイルアプリの開発体制と開発プロセスの話
AbemaTV モバイルアプリの開発体制と開発プロセスの話
 
Apple TV tvOS入門 Iosdc2017
Apple TV tvOS入門 Iosdc2017Apple TV tvOS入門 Iosdc2017
Apple TV tvOS入門 Iosdc2017
 
AbemaTV on tvOS
AbemaTV on tvOSAbemaTV on tvOS
AbemaTV on tvOS
 
Flux with RxSwift
Flux with RxSwiftFlux with RxSwift
Flux with RxSwift
 
CarPlayの対応方法と日本での現状
CarPlayの対応方法と日本での現状CarPlayの対応方法と日本での現状
CarPlayの対応方法と日本での現状
 

AWA with Realm

Notas del editor

  1. avexとCAが半分ずつ出資してつくった会社 楽曲提供レーベル社数は現在は23社 今年中に500万曲、来年には1,000万曲 (リリースして2週間足らずで約100万ダウンロード)
  2. 勉強会で良く見かける公式のベンチマーク とりあえず速そう