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
Realm iOS Code Review
Search
USAMI Kosuke
March 26, 2017
Programming
1.5k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Realm iOS Code Review
https://realm.connpass.com/event/49669/
USAMI Kosuke
March 26, 2017
More Decks by USAMI Kosuke
See All by USAMI Kosuke
Onsager代数とその周辺 / Onsager algebra tsudoi
usamik26
0
700
Apple HIG 正式名称クイズ結果発表 / HIG Quiz Result
usamik26
0
260
ゆめみ大技林製作委員会の立ち上げの話 / daigirin project
usamik26
0
390
@ViewLoadingプロパティラッパの紹介と自前で実装する方法 / @ViewLoading property wrapper implementation
usamik26
0
550
これからUICollectionViewを実践活用する人のためのガイド / Guide to UICollectionView
usamik26
1
820
Xcodeとの最近の付き合い方のはなし / Approach To Xcode
usamik26
2
730
UICollectionView Compositional Layout
usamik26
0
870
Coding Swift with Visual Studio Code and Docker
usamik26
0
580
Swift Extension for Visual Studio Code
usamik26
2
1.1k
Other Decks in Programming
See All in Programming
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
240
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
230
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
3.8k
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
250
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
160
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
740
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
110
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
280
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
160
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
340
さぁV100、メモリをお食べ・・・
nilpe
0
140
New "Type" system on PicoRuby
pocke
1
860
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
How to build a perfect <img>
jonoalderson
1
5.6k
How GitHub (no longer) Works
holman
316
150k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
720
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Tell your own story through comics
letsgokoyo
1
950
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
360
A Modern Web Designer's Workflow
chriscoyier
698
190k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
Transcript
Realm iOS Λ͏ͱ͖ͷ ϋϚΓϙΠϯτ USAMI Kosuke (Fenrir Inc.)
ࣗݾհ » Ӊࠤݟ ެีʢ@usamik26ʣ » ϑΣϯϦϧגࣜձࣾ » iOS ΞϓϦ։ൃΤϯδχΞ »
Swift » Xamarin.iOS » ͖ͳϥΠϒϥϦ RxSwift
Realm » ࠷ۙ 1ʙ2 ͰؔΘ͍ͬͯΔ։ൃҊ݅ͷ΄ͱΜͲͰ Realm ࠾༻ » Realm Objective-C
» Realm Swift » Realm Xamarin
ͳͥ Realm ͳͷ͔ʁ
ͳͥ Realm ͳͷ͔ʁ ͦͷલʹ… » ͦͦɺΞϓϦʹσʔλϕʔεʢDBʣΛଂ͢Δඞཁ͕͋Δ͔ʁ » DB ͳΜͯ໘ͦ͏… »
ଞʹͬͱ؆୯ͳํ๏͕͋ΔͷͰ…
σʔλϕʔεղܾͷҰखஈ » ͜Μͳ͜ͱ͕͍ͨ͠ » αʔόʔ͔Βऔಘͨ͠σʔλΛ͠Β͘ஔ͍͓͖͍ͯͨ » ΦϑϥΠϯͰલճऔಘͨ͠σʔλͰಈ࡞͍ͤͨ͞ » ϚελʔσʔλΛଂ͍ͨ͠ »
σʔλϕʔεͦΕΛղܾ͢Δखஈͷͻͱͭʹ͗͢ͳ͍
Realm ͦΕΒͷ༏Εͨղܾखஈ » ΈࠐΈ͕؆୯ » ίʔσΟϯά͕؆୯ » ͔ͩΒɺΧδϡΞϧͳ༻్ʹ͏ͷ͕ۤʹͳΒͳ͍
ϋϚΓϙΠϯτ » Realm Λ࠾༻͢ΔϓϩδΣΫτ͕૿͑ͨ » ͕ͨͬͯ͠ɺͦΕΛίʔυϨϏϡʔ͢Δػձ͕૿͑ͨ » ϨϏϡʔͨ͠தͰɺΑ͋͘ΔϋϚΓϙΠϯτΛڍ͛ͯΈ͍ͨ » ࣮ࡍʹυΩϡϝϯτಡΜͰਖ਼͘͠ѻ͑େৎ
ϑΝΠϧͷஔ͖ॴ
Realm ϑΝΠϧͷஔ͖ॴ » σϑΥϧτͰ Documents ϑΥϧμʹ࡞ΒΕΔ » ͍Ζ͍Ζࢼ͍ͨ࣌͠ʹศར » ͨͩ͠ɺσϑΥϧτͷ··Կߟ͑ͣʹϦϦʔεͯ͠μϝ
iCloud όοΫΞοϓ » Documents ϑΥϧμ iCloud όοΫΞοϓͷର » iCloud όοΫΞοϓͷඞཁ༰ྔ͕Ε্͕ͬͯ͠·͏
» ؾ͔ͮͣʹϦϦʔεͯ͠͠·͏ͱҰେࣄ
ରॲํ๏ » ҎԼͷͲΕ͔Ͱରॲ͢Δ » (1) ϑΝΠϧͷஔ͖ॴΛม͑Δ » (1-a) defaultRealm ͷઃఆΛม͑Δ
» (1-b) σϑΥϧτҎ֎ͷ Realm Λ͏ » (2) ϑΝΠϧͷஔ͖ॴͦͷ··ͰɺόοΫΞοϓର͔Βআ֎
Realm.Configuration var config = Realm.Configuration() config.fileURL = ... // (1-a)
defaultRealm ͷઃఆΛม͑Δ Realm.Configuration.defaultConfiguration = config // (1-b) σϑΥϧτҎ֎ͷ Realm Λ͏ let realm = try! Realm(configuration: config)
όοΫΞοϓର͔Βআ֎ 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) }
Ͳ͏͖͢ʁ » جຊతʹϑΝΠϧͷஔ͖ॴΛม͑Δͷ͕ྑ͍ » Ͳ͜ʹஔ͔ͦ͘ͷΞϓϦͷઃܭ࣍ୈ » όοΫΞοϓର͔Βআ֎͢Δํ๏ඇৗखஈ
τϥϯβΫγϣϯΛ ·ͱΊΔ
τϥϯβΫγϣϯ » σʔλͷॻ͖ࠐΈ realm.write Λ͏ » realm.write ͷͨͼʹτϥϯβΫγϣϯ͕ൃੜ » ʢ͜ͷ͋ͨΓɺRealm
͕σʔλϕʔεͰ͋Δ͜ͱΛ࠶ೝࣝʣ
τϥϯβΫγϣϯ·ͱΊΔ͖ » ϑΝΠϧΞΫηεͷͨΊɺΦʔόʔϔου͕͋Δ » ·ͨɺRealm ϑΝΠϧ͕ංେԽ͢ΔݪҼʹͳΔ » τϥϯβΫγϣϯϩά͕ཷ·͍ͬͯͨ͘Ί » Realm
ϑΝΠϧ༰ྔ͕͙͢େ͖͘ͳΔͳΒٙͬͯΈΔ
τϥϯβΫγϣϯ͕૿͑Δύλʔϯ(1) » ϧʔϓͷதͰຖճ realm.write ΛݺΜͰ͍ͳ͍͔ʁ » Reactive ܥͰ realm.write ͷճΛҙ͍ࣝͯ͠Δ͔ʁ
» খ͞ͳ do map Ͱࡉ͔͘ realm.write ͍ͯͨ͠Γͱ͔
τϥϯβΫγϣϯ͕૿͑Δύλʔϯ(2) » Realm ʹϥούʔΛඃ͍ͤͯΔ߹ʢଞ DB ͱͷޓੑΛߟྀͳ Ͳʣ » ࡉ͔͍มߋͷͨͼʹ realm.write
ΛݺΜͰ͍ͳ͍͔ʁ
Ͳ͏͖͢ʁ » realm.write ͷճΛҙࣝͯ͠ݮΒ͢ » Realm ͷϥούʔͦͦ࡞Βͳ͍ͷ͕ϕλʔ
ίϯύΫγϣϯ
ϑΝΠϧංେԽͷରࡦ » ϑΝΠϧαΠζ͕େ͖͘ͳΔͷ͕ؾʹͳΔ߹͋Δ » ରࡦ » τϥϯβΫγϣϯΛ·ͱΊΔʢલड़ʣ » Realm ϑΝΠϧΛ࠷దԽ͢ΔʢίϯύΫγϣϯʣ
ίϯύΫγϣϯͷํ๏ » realm.writeCopy(toFile:) Ͱߦ͑Δ » ଞͷՕॴͰ Realm Λ͍ͬͯͳ͍λΠϛϯάͰߦ͏
ίϯύΫγϣϯͷॲཧ autoreleasepool { let realm = try! Realm() try! realm.writeCopy(toFile:
tempURL) try! FileManager.default.removeItem(at: realmURL) try! FileManager.default.moveItem(at: tempURL, to: realmURL) }
Ͳ͏͖͢ʁ » ίϯύΫγϣϯඞਢͰͳ͍ » ؾʹͳΔͳΒΞϓϦىಈ࣌ͳͲ Realm Λ͍ͬͯͳ͍ՕॴͰ࣮ߦ
ΦϒδΣΫτͷड͚͠
Realm ΦϒδΣΫτͷड͚͠ » ϝιουͷؒͷड͚͠ » ModelɺViewModelɺView ͷؒͷड͚͠ » εϨουͷؒͷड͚͠ »
εϨου͕ҟͳΔ߹ͦͷ··͢͜ͱͰ͖ͳ͍
ड͚͢ํ๏ » ΦϒδΣΫτΛͦͷ··͢ » struct ʹมͯ͢͠ » ϓϥΠϚϦΩʔΛ͢ » ThreadSafeReference
Λ͏
ΦϒδΣΫτΛͦͷ··͢ » ಉ͡εϨουͰ͋Δ͜ͱ͕໌Β͔Ͱ͋Δ߹ » ͨͩɺ͋·Γ֊Λ·͕ͨͬͯ͗͢͠Δͱ͔Γʹ͘͘ͳΔ
struct ʹมͯ͢͠ » Realm ΦϒδΣΫτͰͳ͍ͷʹม͢Δ » มͷख͕͔͔ؒΔ » ΦϒδΣΫτΛͦͷ··ͷܗͰͳ͘৭ʑखΛՃ͍͑ͨ߹ʹ͋Γ
ϓϥΠϚϦΩʔΛ͢ » εϨουΛ·͕ͨΔ߹ͷखܰͳํ๏ͷͻͱͭ // ड͚औΔଆ let realm = try! Realm()
let person = realm.object(ofType: Person.self, forPrimaryKey: key)
ThreadSafeReference Λ͏ » ৽͍͠ํ๏ɺϓϥΠϚϦΩʔ͕ͳͯ͘ྑ͍ // ͢ଆ let personRef = ThreadSafeReference(to:
person) // ड͚औΔଆ let realm = try! Realm() let person = realm.resolve(personRef)
ิ : Realm Πϯελϯεͷऔಘ » let realm = try! Realm()
ඞཁͳ࣌ʹͦͷ࣮ߦͯ͠ྑ͍ » ֤ϝιουͰߦ͏ » ֤ΫϩʔδϟͰߦ͏ » ίετ͕͔͔ΔॲཧͰͳ͍ » realm Λڞ༗͓ͯ͠͏ͱ͢Δͱ͔͑ͬͯ໘
Ͳ͏͖͢ʁ » ϓϥΠϚϦΩʔ·ͨ ThreadSafeReference ͕ྑ͍ » ΦϒδΣΫτͦͷͷΛ͢ͷൣғΛݶఆ͍ͨ͠ » struct ʹม͢Δͷɺͦͷมࣗମʹҙຯ͕͋Δ߹ͷΈ
ΫΤϦΛͲ͜Ͱߦ͏͔
ΫΤϦΛͲͷ֊Ͱߦ͏͔ » Ͳͷ֊ͷ͔ʁ » Model » ViewModel » View (ViewController)
Model » Model ʹϏδωεϩδοΫΛ࣋ͨͤΔ » ͜͜ͰΫΤϦ͕ߦΘΕΔ » ϏδωεϩδοΫΛ ViewModel
View ʹஔ͔ͳ͍
ViewModel » ViewModel ը໘͝ͱͷදࣔ༻ίϯςϯπΛ࡞Δ » ͜͜ͰΫΤϦΛҰ෦׆༻͢Δ » Model ͕มΘͬͨ࣌ʹ Live
Object ͷػೳར༻ » View ༩͑ΒΕͨίϯςϯπΛϨΠΞτ͢Δ͚ͩ
Ͳ͏͖͢ʁ » Model : ϏδωεϩδοΫΛ࣋ͭ » ViewModel : දࣔ༻ίϯςϯπΛ࡞Δ »
View : ϨΠΞτͷΈ
·ͱΊ
·ͱΊ » ϑΝΠϧͷஔ͖ॴ » τϥϯβΫγϣϯΛ·ͱΊΔ » ίϯύΫγϣϯ » ΦϒδΣΫτͷड͚͠ »
ΫΤϦΛͲ͜Ͱߦ͏͔