Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
AWA with Realm (iOS)
波戸 勇二 [Yuji Hato]
INTRODUCTION
自己紹介
System EngineerとしてSIerを経て、2011年サ
イバーエージェントに入社。
複数のAmebaサービスにて、サーバサイド
/Android/iOSを担当し、...
今日は
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 updated...
Service
RealmObjectを扱うServiceを定義
Service
@implementation HogeService
- (EntityHoge *)read: (NSString *)hogeId
{
[[RealmManager realm] refresh];
return [Ent...
ViewController
ViewControllerからはServiceを通して
Realmを操作
ViewController
@property (nonatomic, strong) EntityHoge *hoge;
- (void)loadFromRealm {
self.hoge = [[HogeService shared] r...
Other Topics
RLMRealm
Realmのpath、初期化、Realmインスタンスの取得、Migration、Write用スレッ
ドqueue取得などはwrapper classを作って纏めておくとよい
…
+ (void)prepareRealms {
...
Notifications
Realmのデータ変更時に処理ができますが
Notificationsの詳細情報がないので、きめ細や
かなUI制御ができないため使っていない
@property(nonatomic, strong) RLMNotif...
Migration
テーブル再構築処理かかないといけないので、
モデルが大幅に変更になるような場合はつらい
…
今のところSchemaVersion上げるだけで済んで
いる
Compaction
メモリ系のCrashログが増加してきたので中間
テーブルの肥大化を懸念
1日以上経っていたらCompactionを実行している
まとめ
・複雑なデータを大量に扱うアプリでキャッ
シュ用途として相性が良い
・Realm と Bolts は意外に相性がよい
・クライアントにデータ保存する場合は
サーバ含めたアプリケーション全体の
設計が大事
・Realmチームのサポートが厚い
THANK YOU!
AWA with Realm
Upcoming SlideShare
Loading in …5
×

AWA with Realm

3,034 views

Published on

AWAのRealmを使ったアプリケーション設計のお話

Published in: Software
  • Be the first to comment

AWA with Realm

  1. 1. AWA with Realm (iOS)
  2. 2. 波戸 勇二 [Yuji Hato] INTRODUCTION 自己紹介 System EngineerとしてSIerを経て、2011年サ イバーエージェントに入社。 複数のAmebaサービスにて、サーバサイド /Android/iOSを担当し、現在はAWAのiOSエン ジニア。 Engineer Twitter https://twitter.com/dekatotoro GitHub https://github.com/dekatotoro
  3. 3. 今日は Realmに関しての使い方やTipsは様々な方が紹 介しているので、Realmを使ったアプリケーシ ョン全体の設計の紹介をします
  4. 4. Agenda ・Realmを使う目的 ・Application Architecture ・なぜRealmか ・AWAとは ・Coding Topics ・Other Topics
  5. 5. 洋楽・邦楽問わず、いつでもどこでも好きなだけ楽しむことができ る 月額定額制の音楽ストリーミングサービス
  6. 6. なぜRealmか
  7. 7. なぜRealmか
  8. 8. なぜRealmか ・モデル/リレーションがクラス定義でらく ・パフォーマンスがよい ・クロスプラットフォームでAndroid 同じ設計ができる ・Realm使ってるとかっこよさそう ・ドキュメントの充実 & サポート
  9. 9. Realmを使う目的
  10. 10. Realmを使う目的 ・ストレスフリーなUI/UXの実現
  11. 11. Application Architecture
  12. 12. サーバー クライアント クライアントとサーバ のデータ同期 Application Architecture
  13. 13. サーバー クライアント Dataの差分更新/ 変更チェック Application Architecture 差分のみ
  14. 14. サーバー クライアント オンデマンド保存 Application Architecture 必要になったら 取得
  15. 15. Application Design
  16. 16. そのまえに…
  17. 17. Application Design API Server RealmView ViewController Service
  18. 18. Models Modelの定義
  19. 19. 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なども定義しておくと便利。
  20. 20. Service RealmObjectを扱うServiceを定義
  21. 21. 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を呼び出してから取得。
  22. 22. ViewController ViewControllerからはServiceを通して Realmを操作
  23. 23. 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は使ってない。
  24. 24. Other Topics
  25. 25. 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]; } …
  26. 26. Notifications Realmのデータ変更時に処理ができますが Notificationsの詳細情報がないので、きめ細や かなUI制御ができないため使っていない @property(nonatomic, strong) RLMNotificationToken *token; … self.token = [[LVPRealms realm] addNotificationBlock:^(NSString *note, RLMRealm * realm) { // updateUI }];
  27. 27. Migration テーブル再構築処理かかないといけないので、 モデルが大幅に変更になるような場合はつらい … 今のところSchemaVersion上げるだけで済んで いる
  28. 28. Compaction メモリ系のCrashログが増加してきたので中間 テーブルの肥大化を懸念 1日以上経っていたらCompactionを実行している
  29. 29. まとめ ・複雑なデータを大量に扱うアプリでキャッ シュ用途として相性が良い ・Realm と Bolts は意外に相性がよい ・クライアントにデータ保存する場合は サーバ含めたアプリケーション全体の 設計が大事 ・Realmチームのサポートが厚い
  30. 30. THANK YOU!

×