Slide 1

Slide 1 text

AWA with Realm (iOS)

Slide 2

Slide 2 text

೾ށ ༐ೋ [Yuji Hato] INTRODUCTION ࣗݾ঺հ System Engineerͱͯ͠SIerΛܦͯɺ2011೥αΠ όʔΤʔδΣϯτʹೖࣾɻ ෳ਺ͷAmebaαʔϏεʹͯɺαʔόαΠυ/ Android/iOSΛ୲౰͠ɺݱࡏ͸AWAͷiOSΤϯδ χΞɻ Engineer 5XJUUFSIUUQTUXJUUFSDPNEFLBUPUPSP (JU)VCIUUQTHJUIVCDPNEFLBUPUPSP

Slide 3

Slide 3 text

ࠓ೔͸ Realmʹؔͯ͠ͷ࢖͍ํ΍Tips͸༷ʑͳํ͕঺ հ͍ͯ͠ΔͷͰɺRealmΛ࢖ͬͨΞϓϦέʔ γϣϯશମͷઃܭͷ঺հΛ͠·͢

Slide 4

Slide 4 text

Agenda ɾRealmΛ࢖͏໨త ɾApplication Architecture ɾͳͥRealm͔ ɾAWAͱ͸ ɾCoding Topics ɾOther Topics

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

༸ָɾ๜ָ໰Θͣɺ͍ͭͰ΋Ͳ͜Ͱ΋޷͖ͳָ͚ͩ͠Ή͜ͱ͕Ͱ͖Δ ֹ݄ఆ੍ֹͷԻָετϦʔϛϯάαʔϏε

Slide 7

Slide 7 text

ͳͥRealm͔

Slide 8

Slide 8 text

ͳͥ3FBMN͔

Slide 9

Slide 9 text

ͳͥ3FBMN͔ ɾϞσϧ/ϦϨʔγϣϯ͕ΫϥεఆٛͰΒ͘ ɾύϑΥʔϚϯε͕Α͍ ɾΫϩεϓϥοτϑΥʔϜͰAndroid ɹಉ͡ઃܭ͕Ͱ͖Δ ɾRealm࢖ͬͯΔͱ͔ͬ͜Αͦ͞͏ ɾυΩϡϝϯτͷॆ࣮ & αϙʔτ

Slide 10

Slide 10 text

RealmΛ࢖͏໨త

Slide 11

Slide 11 text

3FBMNΛ࢖͏໨త ɾετϨεϑϦʔͳUI/UXͷ࣮ݱ ɾ௨৴ྔͷ࡟ݮ ɾදࣔ଎౓/ύϑΥʔϚϯεͷ޲্

Slide 12

Slide 12 text

Application Architecture

Slide 13

Slide 13 text

αʔόʔ ΫϥΠΞϯτ ΫϥΠΞϯτͱαʔό ͷσʔλಉظ Application Architecture

Slide 14

Slide 14 text

αʔόʔ ΫϥΠΞϯτ Dataͷࠩ෼ߋ৽/ มߋνΣοΫ Application Architecture ࠩ෼ͷΈ

Slide 15

Slide 15 text

αʔόʔ ΫϥΠΞϯτ ΦϯσϚϯυอଘ Application Architecture ඞཁʹͳͬͨΒ औಘ

Slide 16

Slide 16 text

Application Design

Slide 17

Slide 17 text

ͦͷ·͑ʹ… AWA͸Objective-CͰ࣮૷͍ͯ͠·͢ ઈࢍSwiftॻ͖׵͑த ※Bolts-iOSΛ࢖༻͍ͯ͠·͢

Slide 18

Slide 18 text

Application Design API Server Realm View ViewController Service

Slide 19

Slide 19 text

Models Modelͷఆٛ

Slide 20

Slide 20 text

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ͳͲ΋ఆ͓ٛͯ͘͠ͱศརɻ

Slide 21

Slide 21 text

Service RealmObjectΛѻ͏ServiceΛఆٛ

Slide 22

Slide 22 text

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Λݺͼग़͔ͯ͠Βऔಘɻ

Slide 23

Slide 23 text

ViewController ViewController͔Β͸ServiceΛ௨ͯ͠ RealmΛૢ࡞

Slide 24

Slide 24 text

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͸࢖ͬͯͳ͍ɻ

Slide 25

Slide 25 text

Other Topics

Slide 26

Slide 26 text

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]; } …

Slide 27

Slide 27 text

Notifications Realmͷσʔλมߋ࣌ʹॲཧ͕Ͱ͖·͕͢ Notificationsͷৄࡉ৘ใ͕ͳ͍ͷͰɺ͖Ίࡉ΍ ͔ͳUI੍ޚ͕Ͱ͖ͳ͍ͨΊ࢖͍ͬͯͳ͍ @property(nonatomic, strong) RLMNotificationToken *token; … self.token = [[LVPRealms realm] addNotificationBlock:^(NSString *note, RLMRealm * realm) { // updateUI }];

Slide 28

Slide 28 text

Migration ςʔϒϧ࠶ߏஙॲཧ͔͔ͳ͍ͱ͍͚ͳ͍ͷͰɺ Ϟσϧ͕େ෯ʹมߋʹͳΔΑ͏ͳ৔߹͸ͭΒ ͍… ࠓͷͱ͜ΖSchemaVersion্͛Δ͚ͩͰࡁΜͰ ͍Δ

Slide 29

Slide 29 text

Compaction ϝϞϦܥͷCrashϩά͕૿Ճ͖ͯͨ͠ͷͰதؒ ςʔϒϧͷංେԽΛݒ೦ ̍೔Ҏ্ܦ͍ͬͯͨΒCompactionΛ࣮ߦ͍ͯ͠Δ

Slide 30

Slide 30 text

·ͱΊ ɾෳࡶͳσʔλΛେྔʹѻ͏ΞϓϦͰΩϟο ɹγϡ༻్ͱͯ͠૬ੑ͕ྑ͍ ɾRealm ͱ Bolts ͸ҙ֎ʹ૬ੑ͕Α͍ ɾΫϥΠΞϯτʹσʔλอଘ͢Δ৔߹͸ ɹαʔόؚΊͨΞϓϦέʔγϣϯશମͷ ɹઃܭ͕େࣄ ɾRealmνʔϜͷαϙʔτ͕ް͍

Slide 31

Slide 31 text

THANK YOU!