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の処理を再利用可能かつ合成可能にする
Search
ukitaka
June 10, 2017
Programming
0
880
Realmの処理を再利用可能かつ合成可能にする
https://github.com/ukitaka/RealmIO
の解説
ukitaka
June 10, 2017
Tweet
Share
More Decks by ukitaka
See All by ukitaka
CSの生産性改善を支える分析環境 Mercari CS/CRE Tech Talk #1
ukitaka
1
2.6k
switchのexhaustiveness/redundancy チェック 理論と実装 わいわいswiftc #8 @ukitaka
ukitaka
0
180
SwiftのDemanglerを書く @ わいわいswiftc番外編
ukitaka
0
410
Swiftの型システムに入門する - iOSDC Japan 2018
ukitaka
10
6.1k
Responder Chainを使って コードをスッキリさせたい - 第1回 HAKATA.swift
ukitaka
6
1.3k
理論から入門するswift/lib/Sema - わいわいswiftc #1
ukitaka
5
1.6k
マルチスレッドRxSwift @ 社内RxSwift勉強会
ukitaka
5
1.2k
今日こそ理解するHot / Cold @社内RxSwift勉強会
ukitaka
14
2.6k
RxSwift コードリーディングの勘所@社内RxSwift勉強会
ukitaka
3
1k
Other Decks in Programming
See All in Programming
Outline View in SwiftUI
1024jp
1
330
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.3k
イベント駆動で成長して委員会
happymana
1
330
EMになってからチームの成果を最大化するために取り組んだこと/ Maximize team performance as EM
nashiusagi
0
100
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
250
ActiveSupport::Notifications supporting instrumentation of Rails apps with OpenTelemetry
ymtdzzz
1
250
subpath importsで始めるモック生活
10tera
0
310
色々なIaCツールを実際に触って比較してみる
iriikeita
0
330
OSSで起業してもうすぐ10年 / Open Source Conference 2024 Shimane
furukawayasuto
0
110
どうして僕の作ったクラスが手続き型と言われなきゃいけないんですか
akikogoto
1
120
Nurturing OpenJDK distribution: Eclipse Temurin Success History and plan
ivargrimstad
0
960
Tauriでネイティブアプリを作りたい
tsucchinoko
0
370
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
Fireside Chat
paigeccino
34
3k
Building Applications with DynamoDB
mza
90
6.1k
Thoughts on Productivity
jonyablonski
67
4.3k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
130
A designer walks into a library…
pauljervisheath
204
24k
A better future with KSS
kneath
238
17k
The World Runs on Bad Software
bkeepers
PRO
65
11k
GitHub's CSS Performance
jonrohan
1030
460k
Designing the Hi-DPI Web
ddemaree
280
34k
Transcript
RealmͷॲཧΛ࠶ར༻Մೳ ͔ͭ߹Մೳʹ͢Δ @ukitaka
ಥવͰ͕͢Έͳ͞Μ
RealmͷॲཧΛ͢ΔؔΛ Ͳ͏ॻ͍͍ͯ·͔͢
ྫ͑͜͏
ྫ͑͜͏ RealmͷΠϯελϯεதͰੜ͢Δ
ྫ͑͜͏ τϥϯβΫγϣϯΛ࣮ߦ͢Δ
ྑͦ͞͏ʁ
͍͔͕ͭ͋͘Δ
Կ͕͔
Կ͕͔ ͦΕͧΕͰτϥϯβΫγϣϯ͕࣮ߦ͞Εͯ͠·͏
τϥϯβΫγϣϯ • ݺͼग़͠ͷͨͼʹɺॲཧ͕࣮ߦ͞Εͯ͠·͏ ͷͰɺ1ͭͷτϥϯβΫγϣϯʹ·ͱΊΒΕͳ ͍ɻॲཧΛAtomicʹͰ͖ͳ͍ɻ • ॲཧͷهड़ͱ࣮ࡍͷ࣮ߦ͕Ͱ͖͍ͯͳ͍ɻ
τϥϯβΫγϣϯ • RealmʹݶΒͣɺҰൠతʹτϥϯβΫγϣϯͷ ։࢝ॏ͍ॲཧ • ຖճੜ͢Δͷͱ1ͭͷτϥϯβΫγϣϯʹ· ͱΊΔͷͰ(खݩͰܭଌͨ͠ͱ͜Ζ)10ഒҧ͏
ͭ·Γɺ͜ͷ··Ͱ
࠶ར༻͠ʹ͍͘ʂ
None
Ͳ͏͢Δʁ
ෳ༻ͷؔΛผʹ࡞Δʁ
͡Ό͋͜Ε…ʁ
͜ΜͳؔΛຖճ࡞Δͷʁ
߹Ͱ͖ΔΑ͏ʹ͍ͨ͠ʂ
None
τϥϯβΫγϣϯͷ։࢝Λ ͏ଆͰΒͤͯΈΔ
None
None
࠶ར༻ͨ͠Γɺ Έ߹ΘͤͨΓ
1ͭͷτϥϯβΫγϣϯΛ ΈཱͯΔ͜ͱ͕Ͱ͖ΔΑ͏ ʹͳͬͨʂ
࣮ࡍDDDຊͳͲʹͦ͏͠Ζͱ ॻ͍ͯ͋Δ ʮΤϦοΫɾΤϰΝϯεͷυϝΠϯۦಈઃܭʯ ΑΓ
ྑͦ͞͏ʁ
͍͔͕ͭ͋͘Δ
Կ͕͔ • τϥϯβΫγϣϯͷ੍ޚͷݺͼग़͠ଆ ʹ͋Δ͕ɺͦͷ͜ͱΛڧ੍Ͱ͖ͳ͍ɻͭ·Γ ։࢝͠ΕͳͲΛίϯύΠϧ࣌ʹݕग़Ͱ͖ͳ ͍ɻ • γάωνϟΈ͚ͨͩͰτϥϯβΫγϣϯͷ ։͕࢝ඞཁͳͷ͔Ͳ͏͔Θ͔Βͳ͍ɻ
Կ͕͔ τϥϯβΫγϣϯΛ։͖࢝͢ʁ ࣮Կ͔ॻ͖ࠐΜͰ͍ͨΓ͠ͳ͍ʁ (ಡΈࠐΈΛͯ͠ɺͳ͚Ε৽ن࡞ͱ͔)
None
Կ͕͔ • ຖճҾͰ͢ͷͪΐͬͱΊΜͲ͍͘͞ • σϑΥϧτઃఆͷRealmΛ͏ͱ͍͏҉ͷ ྃղ͕͋Εͣ͞ʹதͰੜͯ͠ྑ͍ ͕…
None
ཧ: Ͳ͏ͳ͍ͬͯΕཧ͔ • ॲཧͷ༰Λఆٛͭͭ͠ɺͦΕͧΕΛ߹Ͱ͖Δ Α͏ʹ͍ͨ͠ɻͭ·ΓτϥϯβΫγϣϯΛΈཱ ͯΔλΠϛϯάͱ࣮ߦͷλΠϛϯάΛ͚͍ͨɻ • τϥϯβΫγϣϯͷ։͕࢝ඞཁͰ͋Δ͜ͱΛ໌ࣔ తɺ੩తʹදݱ͍ͨ͠ɻ •
Ͱ͖Ε͍׳ΕͨI/FͰɺ؆ܿʹॻ͖͍ͨ
ཧ: Ͳ͏ͳ͍ͬͯΕཧ͔ • ॲཧͷ༰Λఆٛͭͭ͠ɺͦΕͧΕΛ߹Ͱ͖Δ Α͏ʹ͍ͨ͠ɻͭ·ΓτϥϯβΫγϣϯΛΈཱ ͯΔλΠϛϯάͱ࣮ߦͷλΠϛϯάΛ͚͍ͨɻ • τϥϯβΫγϣϯͷ։͕࢝ඞཁͰ͋Δ͜ͱΛ໌ࣔ తɺ੩తʹදݱ͍ͨ͠ɻ •
Ͱ͖Ε͍׳ΕͨI/FͰɺ؆ܿʹॻ͖͍ͨ
ΒͲ͔͜Ͱಉ͡Α͏ͳ ͜ͱΛ͍ͬͯΔͷΛ ࣮ݟͨ͜ͱ͕͋Δ
None
None
͜Ε͋Εͩ…
※ۤखͳํͷͨΊʹϞβΠΫॲཧΛࢪ͍ͯ͠·͢
ʮScalaؔܕσβΠϯ&ϓϩάϥϛϯάʯ ΑΓ
ؔܕϓϩάϥϛϯάͷྗΛ आΓΔ
࡞ͬͨ
RealmIO https://github.com/ukitaka/RealmIO
Ͳ͏࡞͔ͬͨʁ
͜ΕΛ
͜͏͡Ό
͜͏͡Ό CurryԽ͢Δͱڞ௨ͷύλʔϯ͕ݟ͑Δ
None
ͯ͢ͷRealmͷॲཧ͜͏දͤΔ ※ʮRealmΛड͚औͬͯԿ͔Λͯ݁͠ՌΛฦ͢ʯΈ͍ͨͳײ͡Ͱ͢ɻ ※ErrorॲཧҰ୴ߟ͑ͯ·ͤΜ
͞Βʹ͜ΕΛ
͜͏͡Ό
ͭ·Γ͜ΕΛ
͜͏͡Ό
͜ͷܕΛϕʔεʹਐΊΔ
͜͜·Ͱͷ·ͱΊ
ڞ௨෦͕͋ͬͨͷͰ͜͏͚ͨͩ͠
RealmIO<T>
RealmIO<T>
RealmIO<T>
RealmIO<T>
࣮ࡍͷίʔυͰErrorΛthrow Ͱ͖ΔΑ͏ʹͳ͍ͬͯΔ
ͳΜͱͳ͘ runΛݺͿ·Ͱ࣮ߦ͞Εͳ͍ ײ͡ग़͖ͯͨ
͕ɺ ·ͩͳʹղܾ͍ͯ͠ͳ͍
ͩΕτϥϯβΫγϣϯ ։࢝ͯ͠ͳ͘Ͷʁ
࡞Δ
τϥϯβΫγϣϯ੍ޚ
τϥϯβΫγϣϯ੍ޚ Realm͕RealmIOΛҾʹऔͬͯ
τϥϯβΫγϣϯ੍ޚ τϥϯβΫγϣϯ։࢝ͯ͠
τϥϯβΫγϣϯ੍ޚ ࣮ߦ !!!
τϥϯβΫγϣϯ੍ޚ • ͏ͱ͖realm.run(io:) ΛݺͿΑ͏ʹ͢Δ • io.runݺͳ͍Α͏ʹɺ࣮ࡍinternal ͳΓʹ͓ͯ͘͠ɻ
ͱ͜ΖͰRead͚ͩͷͱ͖ʁ
τϥϯβΫγϣϯ੍ޚ • ύϑΥʔϚϯεతʹɺແବʹτϥϯβΫ γϣϯΛ։͖࢝͢Ͱͳ͍ɻ • ಡΈࠐΈͷΈͷ߹τϥϯβΫγϣϯΛ։ ࢝͠ͳ͍Α͏ʹ͢ΔͨΊʹɺॲཧ͕Readͳͷ ͔Writeͳͷ͔Λผ͢ΔΈ͕ඞཁɻ
τϥϯβΫγϣϯ੍ޚ ܕใ͔ΒRead/Write͕ผͰ͖ͳ͍
࡞Δ
͜ΕΛ
͜͏͡Ό
͜͏͡Ό Read͔Write͔ΛܕύϥϝʔλͰද͢
ͭ·Γ͜ΕΛ
͜͏͡Ό
͜͏͡Ό Read͔Write͔Λද͢ܕύϥϝʔλ
͜͏͡Ό ฦΓͷܕΛද͢ܕύϥϝʔλ
τϥϯβΫγϣϯ੍ޚ
τϥϯβΫγϣϯ੍ޚ Writeͷ߹τϥϯβΫγϣϯΛ ։͔࢝ͯ͠ΒॲཧΛ࣮ߦ
τϥϯβΫγϣϯ੍ޚ Readͷ߹τϥϯβΫγϣϯΛ ։࢝ͤͣʹॲཧΛ࣮ߦ
Ͱ͖͖ͯͨ
࣮ࡍʹެ։͍ͯ͠Δίʔυͱ ΄΅͓ͳ͡
PhantomType ͪͳΈʹRWܕύϥϝʔλ PhantomType(༓ྶܕ)ͱ͍ͬͯɺRead / WriteΛද͚ͩ͢ͰɺͲͷϝιουͷγάω νϟʹݱΕͳ͍ɻ
͜͜·Ͱͷ·ͱΊ
None
flatMapͰ ߹Ͱ͖ΔΑ͏ʹ͢Δ
͍ํΠϝʔδ
͍ํΠϝʔδ
ͻͱ͕ͭ͋Δ
߹ͨ͠Β Read / Write Ͳ͏ͳΔʁ
Read / Write
Read / Write RWܕύϥϝʔλʹԠͯ͡ ෳͷflatMapͷ࣮͕ඞཁ
Read / Write
τϥϯβΫγϣϯ ͪΖΜrunͨ͠Β1ͭͷ τϥϯβΫγϣϯͰॲཧ͕ߦΘΕΔ
ʂ
ͪͳΈʹϥΠϒϥϦͰɺrealmͷ ϝιουͷRealmIO൛Λఏڙ
ᘳʁ
Ͱ͖ͳ͔ͬͨ͜ͱ • εϨουʹ͍ͭͯͳʹͰ͖ͳ͔ͬͨɻॲ ཧͷهड़ͱ࣮ߦΛ͍ͯ͠ΔͷͰɺͦͷ2ͭ ͕ผεϨουͰߦΘΕΔՄೳੑ͕͋ΔͷͰɺ ͦ͜ͷ҆શੑΛϥΠϒϥϦଆͰอূ͔ͨͬ͠ ͕ͨɺThreadSafeReferenceͷ੍ͰͰ͖ ͣɻ
Ͱ͖ͳ͔ͬͨ͜ͱ objectΛҾड͚औΔϝιουʹ͓͍ͯɺ ݺͼग़࣌͠ͷεϨουͱ
Ͱ͖ͳ͔ͬͨ͜ͱ realm.run(io:)Λݺͼग़͢εϨου͕ ҧ͏Մೳੑ͕͋Δɻ
Ͱ͖ͳ͔ͬͨ͜ͱ ඞཁͳΒTSRͰҾ͖࣮͢ΛೖΕΑ͏ͱ͕ͨ͠…
Ͱ͖ͳ͔ͬͨ͜ͱ ThreadSafeReferenceτϥϯβΫγϣϯͰ resolveͰ͖ͳ͍ͱ͍͏੍͕͋Δ
Ͱ͖ͳ͔ͬͨ͜ͱ ͜͜τϥϯβΫγϣϯͳͷͰ resolveͰ͖ͳ͍
Ͱ͖ͳ͔ͬͨ͜ͱ • ࣮ࡍʹେ͖ͳʹͳΔ͔ͱݴΘΕΔͱɺͦ ͜·ͰͰͳ͍(ͱߟ͍͑ͯΔ)ɻಉ͡εϨου Ͱrealm.run(io:)ΛݺͿ͔ɺobjectΛҾͰड ͚औΔϝιουflatMapͷதͰ͏Α͏ʹ͢ Εى͖ͳ͍ɻ
Ͱ͖ͳ͔ͬͨ͜ͱ • Stack overflowͷՄೳੑ͕ͳ͘ͳ͍ɻͰͦ Μͳʹ߹͢Δ͜ͱݱ࣮తʹͳ͍ͷͰɺ ΄ͱΜͲʹͳΒͳ͍ɻ • RxSwift͕Stack overflowى͜͢ͷͱಉ͘͡Β ͍ͷϦεΫ(΄΅ͳ͍)
Ͱ͖ͳ͔ͬͨ͜ͱ • ଞͷϞφυͱΈ߹ΘͤΔͷ(ݱࡏͷSwiftͰ )͍͠ɻྫ͑RxSwiftΛ͍ͬͯΔ߹ɺ ObservableͱRealmIOΛ͏·͘Έ߹ΘͤΔ ͷݫ͍͠ɻ • ͜Εߴ֊ଟ૬͕ͳ͍ͱݫ͍͕͠…Swiftʹ ೖΒͳͦ͞͏
ࢀߟ • ReaderϞφυ • Slick (ScalaͷDBϥΠϒϥϦ) • ΞΠσΟΞ͜ΕͷDBIOAction͔Β • υϫϯΰൿͷτϥϯβΫγϣϯϞφυΛղઆ
IUUQRJJUBDPNQBC@UFDIJUFNTFDEDGGB
RealmIO https://github.com/ukitaka/RealmIO