Slide 1

Slide 1 text

Realm iOS Λ࢖͏ͱ͖ͷ ϋϚΓϙΠϯτ USAMI Kosuke (Fenrir Inc.)

Slide 2

Slide 2 text

ࣗݾ঺հ » Ӊࠤݟ ެีʢ@usamik26ʣ » ϑΣϯϦϧגࣜձࣾ » iOS ΞϓϦ։ൃΤϯδχΞ » Swift » Xamarin.iOS » ޷͖ͳϥΠϒϥϦ͸ RxSwift

Slide 3

Slide 3 text

Realm » ࠷ۙ 1ʙ2 ೥ͰؔΘ͍ͬͯΔ։ൃҊ݅ͷ΄ͱΜͲͰ Realm ࠾༻ » Realm Objective-C » Realm Swift » Realm Xamarin

Slide 4

Slide 4 text

ͳͥ Realm ͳͷ͔ʁ

Slide 5

Slide 5 text

ͳͥ Realm ͳͷ͔ʁ ͦͷલʹ… » ͦ΋ͦ΋ɺΞϓϦʹσʔλϕʔεʢDBʣΛ಺ଂ͢Δඞཁ͕͋Δ͔ʁ » DB ͳΜͯ໘౗ͦ͏… » ଞʹ΋ͬͱ؆୯ͳํ๏͕͋ΔͷͰ͸…

Slide 6

Slide 6 text

σʔλϕʔε͸໰୊ղܾͷҰखஈ » ͜Μͳ͜ͱ͕͍ͨ͠ » αʔόʔ͔Βऔಘͨ͠σʔλΛ͠͹Β͘ஔ͍͓͖͍ͯͨ » ΦϑϥΠϯͰ΋લճऔಘͨ͠σʔλͰಈ࡞͍ͤͨ͞ » ϚελʔσʔλΛ಺ଂ͍ͨ͠ » σʔλϕʔε͸ͦΕΛղܾ͢Δखஈͷͻͱͭʹ͗͢ͳ͍

Slide 7

Slide 7 text

Realm ͸ͦΕΒͷ༏Εͨղܾखஈ » ૊ΈࠐΈ͕؆୯ » ίʔσΟϯά͕؆୯ » ͔ͩΒɺΧδϡΞϧͳ༻్ʹ࢖͏ͷ͕ۤʹͳΒͳ͍

Slide 8

Slide 8 text

ϋϚΓϙΠϯτ » Realm Λ࠾༻͢ΔϓϩδΣΫτ͕૿͑ͨ » ͕ͨͬͯ͠ɺͦΕΛίʔυϨϏϡʔ͢Δػձ͕૿͑ͨ » ϨϏϡʔͨ͠தͰɺΑ͋͘ΔϋϚΓϙΠϯτΛڍ͛ͯΈ͍ͨ » ࣮ࡍʹ͸υΩϡϝϯτಡΜͰਖ਼͘͠ѻ͑͹େৎ෉

Slide 9

Slide 9 text

ϑΝΠϧͷஔ͖৔ॴ

Slide 10

Slide 10 text

Realm ϑΝΠϧͷஔ͖৔ॴ » σϑΥϧτͰ͸ Documents ϑΥϧμ಺ʹ࡞ΒΕΔ » ͍Ζ͍Ζࢼ͍ͨ࣌͠ʹศར » ͨͩ͠ɺσϑΥϧτͷ··Կ΋ߟ͑ͣʹϦϦʔεͯ͠͸μϝ

Slide 11

Slide 11 text

iCloud όοΫΞοϓ » Documents ϑΥϧμ͸ iCloud όοΫΞοϓͷର৅ » iCloud όοΫΞοϓͷඞཁ༰ྔ͕๲Ε্͕ͬͯ͠·͏ » ؾ͔ͮͣʹϦϦʔεͯ͠͠·͏ͱҰେࣄ

Slide 12

Slide 12 text

ରॲํ๏ » ҎԼͷͲΕ͔Ͱରॲ͢Δ » (1) ϑΝΠϧͷஔ͖৔ॴΛม͑Δ » (1-a) defaultRealm ͷઃఆΛม͑Δ » (1-b) σϑΥϧτҎ֎ͷ Realm Λ࢖͏ » (2) ϑΝΠϧͷஔ͖৔ॴ͸ͦͷ··ͰɺόοΫΞοϓର৅͔Βআ֎

Slide 13

Slide 13 text

Realm.Configuration var config = Realm.Configuration() config.fileURL = ... // (1-a) defaultRealm ͷઃఆΛม͑Δ Realm.Configuration.defaultConfiguration = config // (1-b) σϑΥϧτҎ֎ͷ Realm Λ࢖͏ let realm = try! Realm(configuration: config)

Slide 14

Slide 14 text

όοΫΞοϓର৅͔Βআ֎ let realmURL = Realm.Configuration.defaultConfiguration.fileURL! let realmURLs = [ // ஫ҙɿର৅ϑΝΠϧ͸ Realm ͷόʔδϣϯʹΑΓมΘΔ realmURL, realmURL.appendingPathExtension("lock"), realmURL.appendingPathExtension("note"), realmURL.appendingPathExtension("management") ] // (2) όοΫΞοϓର৅͔Βআ֎ʢ஫ҙɿઌʹ Realm ΛҰ౓࡞੒͓ͯ͘͜͠ͱʣ realmURLs.forEach { fileURL in fileURL.setResourceValue(true, forKey: NSURLIsExcludedFromBackupKey) }

Slide 15

Slide 15 text

Ͳ͏͢΂͖ʁ » جຊతʹ͸ϑΝΠϧͷஔ͖৔ॴΛม͑Δͷ͕ྑ͍ » Ͳ͜ʹஔ͔͘͸ͦͷΞϓϦͷઃܭ࣍ୈ » όοΫΞοϓର৅͔Βআ֎͢Δํ๏͸ඇৗखஈ

Slide 16

Slide 16 text

τϥϯβΫγϣϯΛ ·ͱΊΔ

Slide 17

Slide 17 text

τϥϯβΫγϣϯ » σʔλͷॻ͖ࠐΈ͸ realm.write Λ࢖͏ » realm.write ͷͨͼʹτϥϯβΫγϣϯ͕ൃੜ » ʢ͜ͷ͋ͨΓɺRealm ͕σʔλϕʔεͰ͋Δ͜ͱΛ࠶ೝࣝʣ

Slide 18

Slide 18 text

τϥϯβΫγϣϯ͸·ͱΊΔ΂͖ » ϑΝΠϧΞΫηεͷͨΊɺΦʔόʔϔου͕͋Δ » ·ͨɺRealm ϑΝΠϧ͕ංେԽ͢ΔݪҼʹ΋ͳΔ » τϥϯβΫγϣϯϩά͕ཷ·͍ͬͯͨ͘Ί » Realm ϑΝΠϧ༰ྔ͕͙͢େ͖͘ͳΔͳΒٙͬͯΈΔ

Slide 19

Slide 19 text

τϥϯβΫγϣϯ͕૿͑Δύλʔϯ(1) » ϧʔϓͷதͰຖճ realm.write ΛݺΜͰ͍ͳ͍͔ʁ » Reactive ܥͰ realm.write ͷճ਺Λҙ͍ࣝͯ͠Δ͔ʁ » খ͞ͳ do ΍ map Ͱࡉ͔͘ realm.write ͍ͯͨ͠Γͱ͔

Slide 20

Slide 20 text

τϥϯβΫγϣϯ͕૿͑Δύλʔϯ(2) » Realm ʹϥούʔΛඃ͍ͤͯΔ৔߹ʢଞ DB ͱͷޓ׵ੑΛߟྀͳ Ͳʣ » ࡉ͔͍มߋͷͨͼʹ realm.write ΛݺΜͰ͍ͳ͍͔ʁ

Slide 21

Slide 21 text

Ͳ͏͢΂͖ʁ » realm.write ͷճ਺Λҙࣝͯ͠ݮΒ͢ » Realm ͷϥούʔ͸ͦ΋ͦ΋࡞Βͳ͍ͷ͕ϕλʔ

Slide 22

Slide 22 text

ίϯύΫγϣϯ

Slide 23

Slide 23 text

ϑΝΠϧංେԽͷରࡦ » ϑΝΠϧαΠζ͕େ͖͘ͳΔͷ͕ؾʹͳΔ৔߹΋͋Δ » ରࡦ » τϥϯβΫγϣϯΛ·ͱΊΔʢલड़ʣ » Realm ϑΝΠϧΛ࠷దԽ͢ΔʢίϯύΫγϣϯʣ

Slide 24

Slide 24 text

ίϯύΫγϣϯͷํ๏ » realm.writeCopy(toFile:) Ͱߦ͑Δ » ଞͷՕॴͰ Realm Λ࢖͍ͬͯͳ͍λΠϛϯάͰߦ͏

Slide 25

Slide 25 text

ίϯύΫγϣϯͷॲཧ autoreleasepool { let realm = try! Realm() try! realm.writeCopy(toFile: tempURL) try! FileManager.default.removeItem(at: realmURL) try! FileManager.default.moveItem(at: tempURL, to: realmURL) }

Slide 26

Slide 26 text

Ͳ͏͢΂͖ʁ » ίϯύΫγϣϯ͸ඞਢͰ͸ͳ͍ » ؾʹͳΔͳΒΞϓϦىಈ࣌ͳͲ Realm Λ࢖͍ͬͯͳ͍ՕॴͰ࣮ߦ

Slide 27

Slide 27 text

ΦϒδΣΫτͷड͚౉͠

Slide 28

Slide 28 text

Realm ΦϒδΣΫτͷड͚౉͠ » ϝιουͷؒͷड͚౉͠ » ModelɺViewModelɺView ͷؒͷड͚౉͠ » εϨουͷؒͷड͚౉͠ » εϨου͕ҟͳΔ৔߹͸ͦͷ··౉͢͜ͱ͸Ͱ͖ͳ͍

Slide 29

Slide 29 text

ड͚౉͢ํ๏ » ΦϒδΣΫτΛͦͷ··౉͢ » struct ʹม׵ͯ͠౉͢ » ϓϥΠϚϦΩʔΛ౉͢ » ThreadSafeReference Λ࢖͏

Slide 30

Slide 30 text

ΦϒδΣΫτΛͦͷ··౉͢ » ಉ͡εϨουͰ͋Δ͜ͱ͕໌Β͔Ͱ͋Δ৔߹ » ͨͩɺ͋·Γ֊૚Λ·͕ͨͬͯ౉͗͢͠Δͱ෼͔Γʹ͘͘ͳΔ

Slide 31

Slide 31 text

struct ʹม׵ͯ͠౉͢ » Realm ΦϒδΣΫτͰ͸ͳ͍΋ͷʹม׵͢Δ » ม׵ͷख͕͔͔ؒΔ » ΦϒδΣΫτΛͦͷ··ͷܗͰͳ͘৭ʑखΛՃ͍͑ͨ৔߹ʹ͸͋Γ

Slide 32

Slide 32 text

ϓϥΠϚϦΩʔΛ౉͢ » εϨουΛ·͕ͨΔ৔߹ͷखܰͳํ๏ͷͻͱͭ // ड͚औΔଆ let realm = try! Realm() let person = realm.object(ofType: Person.self, forPrimaryKey: key)

Slide 33

Slide 33 text

ThreadSafeReference Λ࢖͏ » ৽͍͠ํ๏ɺϓϥΠϚϦΩʔ͕ͳͯ͘΋ྑ͍ // ౉͢ଆ let personRef = ThreadSafeReference(to: person) // ड͚औΔଆ let realm = try! Realm() let person = realm.resolve(personRef)

Slide 34

Slide 34 text

ิ଍ : Realm Πϯελϯεͷऔಘ » let realm = try! Realm() ͸ඞཁͳ࣌ʹͦͷ౎౓࣮ߦͯ͠ྑ͍ » ֤ϝιουͰߦ͏ » ֤ΫϩʔδϟͰߦ͏ » ίετ͕͔͔ΔॲཧͰ͸ͳ͍ » realm Λڞ༗ͯ͠࢖͓͏ͱ͢Δͱ͔͑ͬͯ໘౗

Slide 35

Slide 35 text

Ͳ͏͢΂͖ʁ » ϓϥΠϚϦΩʔ·ͨ͸ ThreadSafeReference ͕ྑ͍ » ΦϒδΣΫτͦͷ΋ͷΛ౉͢ͷ͸ൣғΛݶఆ͍ͨ͠ » struct ʹม׵͢Δͷ͸ɺͦͷม׵ࣗମʹҙຯ͕͋Δ৔߹ͷΈ

Slide 36

Slide 36 text

ΫΤϦΛͲ͜Ͱߦ͏͔

Slide 37

Slide 37 text

ΫΤϦΛͲͷ֊૚Ͱߦ͏͔ » Ͳͷ֊૚ͷ੹຿͔ʁ » Model » ViewModel » View (ViewController)

Slide 38

Slide 38 text

Model » Model ૚ʹϏδωεϩδοΫΛ࣋ͨͤΔ » ͜͜ͰΫΤϦ͕ߦΘΕΔ » ϏδωεϩδοΫΛ ViewModel ΍ View ʹஔ͔ͳ͍

Slide 39

Slide 39 text

ViewModel » ViewModel ૚͸ը໘͝ͱͷදࣔ༻ίϯςϯπΛ࡞Δ » ͜͜Ͱ΋ΫΤϦΛҰ෦׆༻͢Δ » Model ͕มΘͬͨ࣌ʹ Live Object ͷػೳར༻ » View ͸༩͑ΒΕͨίϯςϯπΛϨΠΞ΢τ͢Δ͚ͩ

Slide 40

Slide 40 text

Ͳ͏͢΂͖ʁ » Model : ϏδωεϩδοΫΛ࣋ͭ » ViewModel : දࣔ༻ίϯςϯπΛ࡞Δ » View : ϨΠΞ΢τͷΈ

Slide 41

Slide 41 text

·ͱΊ

Slide 42

Slide 42 text

·ͱΊ » ϑΝΠϧͷஔ͖৔ॴ » τϥϯβΫγϣϯΛ·ͱΊΔ » ίϯύΫγϣϯ » ΦϒδΣΫτͷड͚౉͠ » ΫΤϦΛͲ͜Ͱߦ͏͔