https://github.com/ukitaka/RealmIO の解説
RealmͷॲཧΛ࠶ར༻Մೳ͔ͭ߹Մೳʹ͢Δ@ukitaka
View Slide
ಥવͰ͕͢Έͳ͞Μ
RealmͷॲཧΛ͢ΔؔΛͲ͏ॻ͍͍ͯ·͔͢
ྫ͑͜͏
ྫ͑͜͏RealmͷΠϯελϯεதͰੜ͢Δ
ྫ͑͜͏τϥϯβΫγϣϯΛ࣮ߦ͢Δ
ྑͦ͞͏ʁ
͍͔͕ͭ͋͘Δ
Կ͕͔
Կ͕͔ͦΕͧΕͰτϥϯβΫγϣϯ͕࣮ߦ͞Εͯ͠·͏
τϥϯβΫγϣϯ• ݺͼग़͠ͷͨͼʹɺॲཧ͕࣮ߦ͞Εͯ͠·͏ͷͰɺ1ͭͷτϥϯβΫγϣϯʹ·ͱΊΒΕͳ͍ɻॲཧΛAtomicʹͰ͖ͳ͍ɻ• ॲཧͷهड़ͱ࣮ࡍͷ࣮ߦ͕Ͱ͖͍ͯͳ͍ɻ
τϥϯβΫγϣϯ• RealmʹݶΒͣɺҰൠతʹτϥϯβΫγϣϯͷ։࢝ॏ͍ॲཧ• ຖճੜ͢Δͷͱ1ͭͷτϥϯβΫγϣϯʹ·ͱΊΔͷͰ(खݩͰܭଌͨ͠ͱ͜Ζ)10ഒҧ͏
ͭ·Γɺ͜ͷ··Ͱ
࠶ར༻͠ʹ͍͘ʂ
Ͳ͏͢Δʁ
ෳ༻ͷؔΛผʹ࡞Δʁ
͡Ό͋͜Ε…ʁ
͜ΜͳؔΛຖճ࡞Δͷʁ
߹Ͱ͖ΔΑ͏ʹ͍ͨ͠ʂ
τϥϯβΫγϣϯͷ։࢝Λ͏ଆͰΒͤͯΈΔ
࠶ར༻ͨ͠ΓɺΈ߹ΘͤͨΓ
1ͭͷτϥϯβΫγϣϯΛΈཱͯΔ͜ͱ͕Ͱ͖ΔΑ͏ʹͳͬͨʂ
࣮ࡍDDDຊͳͲʹͦ͏͠Ζͱॻ͍ͯ͋ΔʮΤϦοΫɾΤϰΝϯεͷυϝΠϯۦಈઃܭʯ ΑΓ
Կ͕͔• τϥϯβΫγϣϯͷ੍ޚͷݺͼग़͠ଆʹ͋Δ͕ɺͦͷ͜ͱΛڧ੍Ͱ͖ͳ͍ɻͭ·Γ։࢝͠ΕͳͲΛίϯύΠϧ࣌ʹݕग़Ͱ͖ͳ͍ɻ• γάωνϟΈ͚ͨͩͰτϥϯβΫγϣϯͷ։͕࢝ඞཁͳͷ͔Ͳ͏͔Θ͔Βͳ͍ɻ
Կ͕͔τϥϯβΫγϣϯΛ։͖࢝͢ʁ࣮Կ͔ॻ͖ࠐΜͰ͍ͨΓ͠ͳ͍ʁ(ಡΈࠐΈΛͯ͠ɺͳ͚Ε৽ن࡞ͱ͔)
Կ͕͔• ຖճҾͰ͢ͷͪΐͬͱΊΜͲ͍͘͞• σϑΥϧτઃఆͷRealmΛ͏ͱ͍͏҉ͷྃղ͕͋Εͣ͞ʹதͰੜͯ͠ྑ͍͕…
ཧ: Ͳ͏ͳ͍ͬͯΕཧ͔• ॲཧͷ༰Λఆٛͭͭ͠ɺͦΕͧΕΛ߹Ͱ͖ΔΑ͏ʹ͍ͨ͠ɻͭ·ΓτϥϯβΫγϣϯΛΈཱͯΔλΠϛϯάͱ࣮ߦͷλΠϛϯάΛ͚͍ͨɻ• τϥϯβΫγϣϯͷ։͕࢝ඞཁͰ͋Δ͜ͱΛ໌ࣔతɺ੩తʹදݱ͍ͨ͠ɻ• Ͱ͖Ε͍׳ΕͨI/FͰɺ؆ܿʹॻ͖͍ͨ
ΒͲ͔͜Ͱಉ͡Α͏ͳ͜ͱΛ͍ͬͯΔͷΛ࣮ݟͨ͜ͱ͕͋Δ
͜Ε͋Εͩ…
※ۤखͳํͷͨΊʹϞβΠΫॲཧΛࢪ͍ͯ͠·͢
ʮScalaؔܕσβΠϯ&ϓϩάϥϛϯάʯ ΑΓ
ؔܕϓϩάϥϛϯάͷྗΛआΓΔ
࡞ͬͨ
RealmIOhttps://github.com/ukitaka/RealmIO
Ͳ͏࡞͔ͬͨʁ
͜ΕΛ
͜͏͡Ό
͜͏͡ΌCurryԽ͢Δͱڞ௨ͷύλʔϯ͕ݟ͑Δ
ͯ͢ͷRealmͷॲཧ͜͏දͤΔ※ʮRealmΛड͚औͬͯԿ͔Λͯ݁͠ՌΛฦ͢ʯΈ͍ͨͳײ͡Ͱ͢ɻ※ErrorॲཧҰ୴ߟ͑ͯ·ͤΜ
͞Βʹ͜ΕΛ
ͭ·Γ͜ΕΛ
͜ͷܕΛϕʔεʹਐΊΔ
͜͜·Ͱͷ·ͱΊ
ڞ௨෦͕͋ͬͨͷͰ͜͏͚ͨͩ͠
RealmIO
࣮ࡍͷίʔυͰ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Λද͚ͩ͢ͰɺͲͷϝιουͷγάωνϟʹݱΕͳ͍ɻ
flatMapͰ߹Ͱ͖ΔΑ͏ʹ͢Δ
͍ํΠϝʔδ
ͻͱ͕ͭ͋Δ
߹ͨ͠ΒRead / WriteͲ͏ͳΔʁ
Read / Write
Read / WriteRWܕύϥϝʔλʹԠͯ͡ෳͷflatMapͷ࣮͕ඞཁ
τϥϯβΫγϣϯͪΖΜ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