Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AWA with Realm
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Yuji Hato
June 25, 2015
Technology
100
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
AWA with Realm
Yuji Hato
June 25, 2015
More Decks by Yuji Hato
See All by Yuji Hato
ABEMAにおける 生成AI活用の現在地 / The Current Status of Generative AI at ABEMA
dekatotoro
1
1.2k
ABEMAモバイルアプリ開発のDevOps戦略
dekatotoro
1
730
Multiplatform Engineering Roadmap for the Future
dekatotoro
1
160
Introduction to RIBs
dekatotoro
5
1.4k
継続的な開発スタイル 「AbemaTV iOSアプリを週一で リリースしている話」
dekatotoro
6
4.3k
iOS Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
dekatotoro
0
540
動画アプリをなめらかに動かす技術 - iOS -
dekatotoro
0
500
5分で学ぶ差分更新とRxDataSources
dekatotoro
0
370
AbemaTV モバイルアプリの開発体制と 開発プロセスの話
dekatotoro
0
290
Other Decks in Technology
See All in Technology
人材育成分科会.pdf
_awache
4
290
2026TECHFRESH畢業分享會 - AI 時代的人生存檔點
line_developers_tw
PRO
0
1.2k
IaC コードを資産へ:AWS CDK 社内ライブラリと横断展開 / aws-summit-japan-2026
gotok365
2
720
ロボティクスの技術 / Robotics Technology
ks91
PRO
0
100
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
3k
SONiC Scale-Up Working Group から探る Scale-UpやUltraEthernet機能の実装方法
ebiken
PRO
2
400
AIはどのように 組織のアジリティを変えるのか?
junki
4
1k
マルチアカウント環境での コーディングエージェントを使った障害調査が大変なので AIエージェントにReadOnly権限を付与してみた / ReadOnly AI Agents for Multi-Account AWS Incident Response
yamaguchitk333
2
110
10年間のブログ発信を振り返って見えたWebアプリケーションエンジニアとしての軌跡
stefafafan
0
150
Chainlitで作るお手軽チャットUI
ynt0485
0
270
ザ・データベース、MySQL ~ OSC 2026 Sendai ~
sakaik
0
120
When Platform Engineering Meets GenAI
sucitw
0
120
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.9k
KATA
mclloyd
PRO
35
15k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
540
First, design no harm
axbom
PRO
2
1.2k
The Pragmatic Product Professional
lauravandoore
37
7.3k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
390
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Ruling the World: When Life Gets Gamed
codingconduct
0
260
Transcript
AWA with Realm (iOS)
ށ ༐ೋ [Yuji Hato] INTRODUCTION ࣗݾհ System Engineerͱͯ͠SIerΛܦͯɺ2011αΠ όʔΤʔδΣϯτʹೖࣾɻ ෳͷAmebaαʔϏεʹͯɺαʔόαΠυ/
Android/iOSΛ୲͠ɺݱࡏAWAͷiOSΤϯδ χΞɻ Engineer 5XJUUFSIUUQTUXJUUFSDPNEFLBUPUPSP (JU)VCIUUQTHJUIVCDPNEFLBUPUPSP
ࠓ Realmʹؔͯ͠ͷ͍ํTips༷ʑͳํ͕ հ͍ͯ͠ΔͷͰɺRealmΛͬͨΞϓϦέʔ γϣϯશମͷઃܭͷհΛ͠·͢
Agenda ɾRealmΛ͏త ɾApplication Architecture ɾͳͥRealm͔ ɾAWAͱ ɾCoding Topics ɾOther Topics
None
༸ָɾָΘͣɺ͍ͭͰͲ͜Ͱ͖ͳָ͚ͩ͠Ή͜ͱ͕Ͱ͖Δ ֹ݄ఆ੍ֹͷԻָετϦʔϛϯάαʔϏε
ͳͥRealm͔
ͳͥ3FBMN͔
ͳͥ3FBMN͔ ɾϞσϧ/ϦϨʔγϣϯ͕ΫϥεఆٛͰΒ͘ ɾύϑΥʔϚϯε͕Α͍ ɾΫϩεϓϥοτϑΥʔϜͰAndroid ɹಉ͡ઃܭ͕Ͱ͖Δ ɾRealmͬͯΔͱ͔ͬ͜Αͦ͞͏ ɾυΩϡϝϯτͷॆ࣮ & αϙʔτ
RealmΛ͏త
3FBMNΛ͏త ɾετϨεϑϦʔͳUI/UXͷ࣮ݱ ɾ௨৴ྔͷݮ ɾදࣔ/ύϑΥʔϚϯεͷ্
Application Architecture
αʔόʔ ΫϥΠΞϯτ ΫϥΠΞϯτͱαʔό ͷσʔλಉظ Application Architecture
αʔόʔ ΫϥΠΞϯτ Dataͷࠩߋ৽/ มߋνΣοΫ Application Architecture ࠩͷΈ
αʔόʔ ΫϥΠΞϯτ ΦϯσϚϯυอଘ Application Architecture ඞཁʹͳͬͨΒ औಘ
Application Design
ͦͷ·͑ʹ… AWAObjective-CͰ࣮͍ͯ͠·͢ ઈࢍSwiftॻ͖͑த ※Bolts-iOSΛ༻͍ͯ͠·͢
Application Design API Server Realm View 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 3FBMNͷQBUIɺॳظԽɺ3FBMNΠϯελϯεͷऔಘɺ.JHSBUJPOɺ8SJUF༻ εϨουRVFVFऔಘͳͲXSBQQFSDMBTTΛ࡞ͬͯవΊ͓ͯ͘ͱΑ͍ … + (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ϩά͕૿Ճ͖ͯͨ͠ͷͰதؒ ςʔϒϧͷංେԽΛݒ೦ ̍Ҏ্ܦ͍ͬͯͨΒCompactionΛ࣮ߦ͍ͯ͠Δ
·ͱΊ ɾෳࡶͳσʔλΛେྔʹѻ͏ΞϓϦͰΩϟο ɹγϡ༻్ͱͯ͠૬ੑ͕ྑ͍ ɾRealm ͱ Bolts ҙ֎ʹ૬ੑ͕Α͍ ɾΫϥΠΞϯτʹσʔλอଘ͢Δ߹ ɹαʔόؚΊͨΞϓϦέʔγϣϯશମͷ ɹઃܭ͕େࣄ
ɾRealmνʔϜͷαϙʔτ͕ް͍
THANK YOU!