Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
AWA with Realm
Search
Yuji Hato
June 25, 2015
Technology
110
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.3k
ABEMAモバイルアプリ開発のDevOps戦略
dekatotoro
1
800
Multiplatform Engineering Roadmap for the Future
dekatotoro
1
190
Introduction to RIBs
dekatotoro
5
1.5k
継続的な開発スタイル 「AbemaTV iOSアプリを週一で リリースしている話」
dekatotoro
6
4.3k
iOS Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
dekatotoro
0
560
動画アプリをなめらかに動かす技術 - iOS -
dekatotoro
0
520
5分で学ぶ差分更新とRxDataSources
dekatotoro
0
390
AbemaTV モバイルアプリの開発体制と 開発プロセスの話
dekatotoro
0
290
Other Decks in Technology
See All in Technology
2026 Apache Flink Community Checkpoint
rmetzger
0
200
AWS基盤改善を支える 私たちの理念と行動指針
kentosuzuki
0
120
超⼩型・多⾔語検索モデル Bekko Embedding
hotchpotch
1
130
In-Context Learning再入門。ICLの勾配降下的解釈の研究動向を追ってみる。
dai08srhg
1
740
分析作業をどこまで任せるか自分で決められる AIネイティブBI『Golden Analytics』が 良さげな話 /golden-analytics-is-ai-native-bi
shinyaa31
0
130
会社説明資料_最新版
demaecan
0
32k
慶應義塾大学 AI実践05 論文執筆の仕組み化
keio_smilab
PRO
7
3.8k
デザインレビューは自動化できるのか?─ Flutter × Figma で UI 品質保証を考える
techiro
2
830
生成AI時代のIAMのマニアックな話
takuros
6
2.8k
新卒エンジニア、 介護士になる
ryu1013
1
690
evcc & Home Assistant
naltatis
0
260
bpf_arenaとstruct_opsを使うのが難しかった話
masu_mi
0
210
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
433
67k
Prompt Engineering for Job Search
mfonobong
0
580
Faster Mobile Websites
deanohume
310
32k
The Cost Of JavaScript in 2023
addyosmani
56
10k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
1
300
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
510
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
660
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
The Curious Case for Waylosing
cassininazir
1
610
Optimising Largest Contentful Paint
csswizardry
37
4k
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!