RxSwift ίʔυϦʔσΟϯάͷצॴ@ࣾRxSwiftษڧձ
View Slide
ͳΜͰίʔυಡΉඞཁ͕͋Δͷʁhttps://speakerdeck.com/bricklife/rxswiftfalseobserveontosubscribeonwoli-jie-suru
ͳΜͰίʔυಡΉඞཁ͕͋Δͷʁ• ެࣜυΩϡϝϯτ RxMarblesͳͲυΩϡϝϯτॆ࣮͍ͯ͠ΔΑ͏ʹݟ͑Δ͕ɺHotมϚϧνεϨουͳͲ͕͖ؔͯͨ࣌͠ͷڍಈυΩϡϝϯτΛ͏͚ͩͰཧղ͢Δͷ͍͠ɻ• ·ͨɺRxSwiftಠࣗͷ֓೦OperatorͳͲɺReactiveXͷυΩϡϝϯτʹॻ͔Ε͍ͯͳ͍͜ͱগ͋͠Δɻ(DriverͳͲ…)
͜ͷεϥΠυͰ• ओʹOperatorͷ࣮Ͱ͘ΘΕ͍ͯΔ֓೦ख๏Λઆ໌͠·͢ɻ• ͦͷ͋ͱͰ Hot / Cold ͳͲΛྫʹ͋͛ͯɺͲ͏࣮ͬͯݱ͞Ε͍ͯΔͷ͔Λઆ໌͠·͢ɻ
͜ͷεϥΠυͰ• RxSwift v2.5.0 (20167݄࣌Ͱͷmaster)Λݟͯ·͢ɻ• ͨͿΜόʔδϣϯ1ܥࠓޙͷόʔδϣϯͰ௨༻͢Δ͔ෆ໌Ͱ͕͢ɺͨͿΜେ͖͘ζϨΔ͜ͱແ͍ͱࢥ͍·͢ɻ
צॴ ͦͷ1Operatorʹ͓͚Δʮsourceʯ
Sequence Map Filter↑ Α͘Έ͔͚Δਤ
Sequence Map Filter↑ Α͘Έ͔͚Δਤίʔυ্Ͳ͏දݱ͞Ε͍ͯΔʁ
filter
filter࣮ଶFilterͱ͍͏Ϋϥε
filtersourceͱͯ͠ɺfilterΛݺͼग़ͨ͠ObservableΛ͍࣋ͬͯΔ
mapMapಉ༷
ͭ·ΓsourceMapͷsourceSequence(SequenceObservable.ofͷ෦දݱ)
ͭ·ΓsourceFilterͷsourceMap
ͭ·ΓsourceSequence Map Filtersource
ͭ·ΓsourceSequence Map Filtersourcesourceͷ࿈ͳΓͱݴ͑Δ
ͱ͜ΖͰɺsourceSequence Map Filtersource͜Εͷsourceʁ
createܥͷOperatorʹsourceͳ͍• create, just, of, error, never ͳͲɺcreateܥͷOperatorʹsourceͳ͍ɻ• mapfilterͷΑ͏ͳҰൠతͳOperatorɺHotมܥɺsubscribeOn/observeOnʹsource͕͋Δɻ
createܥͷOperatorʹsourceͳ͍• ͔͜͜Βɺී௨ʹʮOperatorʯͱॻ͍͍ͯͨΒʮcreateܥҎ֎ͷOperatorʯͷ͜ͱͩͱࢥ͍ͬͯͩ͘͞ɻ
sourceͲ͏ΘΕΔͷʁ• sourceཁObservableͳͷͰɺదͳλΠϛϯάͰͦͷsourceΛ(෦తʹ) subscribeͯ͠ΠϕϯτΛड͚औΓ࢝Ί·͢ɻ• ͲͷλΠϛϯάͰ(෦తʹ)subscribe͕ݺΕΔ͔ɺHot / ColdͳͲOperatorͷੑ࣭ʹΑͬͯҧ͖ͬͯ·͢ɻ
sourceʹ͍ͭͯ·ͱΊ• createܥҎ֎ͷOperatorલͷObservableΛsourceͱͯ࣋ͭ͜͠ͱͰɺਤͷΑ͏ͳ࿈ͳΓΛ࣮ݱ͍ͯ͠ΔɻsourceSequence Map Filtersource
צॴ ͦͷ2Operator࣮ͰνΣοΫ͖͢
Operatorͷ࣮ͰͳʹΛΈΔ͔ҎԼͲͷOperatorʹڞ௨͢Δಈ͖• దͳλΠϛϯάͰsourceΛsubscribe͢Δ• source͔Βड͚औͬͨΠϕϯτʹదͳॲཧΛՃ͑ͯ࣍ʹྲྀ͢
Operatorͷ࣮ͰͳʹΛΈΔ͔Sequence Map Filter Observersubscribe
Operatorͷ࣮ͰͳʹΛΈΔ͔subscribeSequence Map Filter Observersubscribe subscribe෦తʹsourceΛsubscribe͢Δ
Operatorͷ࣮ͰͳʹΛΈΔ͔Sequence Map Filter Observeron on onΠϕϯτΛड͚औͬͯॲཧΛՃ͑ͯ࣍ʹྲྀ͢
Operatorͷ࣮ͰͳʹΛΈΔ͔subscribeSequence Map Filter Observersubscribe subscribeon on on
Operatorͷ࣮ͰͳʹΛΈΔ͔ΈΔϙΠϯτ3ͭ• ͍ͭsourceͷsubscribeΛߦ͏͔• subscribe͕ݺΕͨΒͳʹ͕ى͜Δ͔• on͕ݺΕͨΒͳʹ͕ى͜Δ͔
ྫ: Filter
ྫ: Filterrunsubscribe͕ݺΕͨͱ͖ʹݺΕΔϝιου
ྫ: Filtersinkͱ͔͍͏͕ͭsourceͷsubscribeΛߦ͍ͬͯΔ
ྫ: FilterSequence Map Filter Observersubscribeͭ·Γɺࣗͷsubscribe͕ݺΕͨΒ
ྫ: FilterSequence Map Filter Observersubscribe subscribesourceͷsubscribeΛߦ͏
ྫ: Filteronsource͔ΒΠϕϯτ͕ྲྀΕ͖ͯͨ࣌ʹݺΕΔϝιου
ྫ: FilterNextͷ߹
ྫ: Filterఆ༻ͷؔʹΛͯ͠
ྫ: Filter݅Λຬ͍ͨͯ͠Ε࣍ྲྀ͢
ྫ: FilterSequence Map Filter Observeronsource͔ΒΠϕϯτ͕དྷͨΒ
ྫ: FilterSequence Map Filter Observeron onఆͨ͠ޙ࣍͢
ಡΊΔʂ ✌('ω'✌ )ࡾ✌('ω')✌ࡾ( ✌'ω')✌
·ͱΊΈΔϙΠϯτ3ͭ• ͍ͭsourceͷsubscribeΛߦ͏͔• subscribe͕ݺΕͨΒͳʹ͕ى͜Δ͔• on͕ݺΕͨΒͳʹ͕ى͜Δ͔
Subject…ಉ͘͡3ͭΛΈΔͱڍಈ͕͔ͭΊΔͱࢥ͍·͢ɻ• ͍ͭsourceͷsubscribeΛߦ͏͔• subscribe͕ݺΕͨΒͳʹ͕ى͜Δ͔• on͕ݺΕͨΒͳʹ͕ى͜Δ͔
createܥͷOperator…ͱΓ͋͑ͣɺ• subscribe͕ݺΕͨΒͳʹ͕ى͜Δ͔͜ΕΛݟ͓͚ͯڍಈ͕Θ͔Δͱࢥ͍·͢ɻ
צॴ ͦͷ3Sink / SinkIter
(෮श) Operatorͷಈ͖• దͳλΠϛϯάͰsourceΛsubscribe͢Δ• source͔Βड͚औͬͨΠϕϯτʹదͳॲཧΛՃ͑ͯ࣍ʹྲྀ͢
(෮श) Operatorͷಈ͖• దͳλΠϛϯάͰsourceΛsubscribe͢Δ• source͔Βड͚औͬͨΠϕϯτʹదͳॲཧΛՃ͑ͯ࣍ʹྲྀ͢୭͕subscribe͢Δͷʁobserver୭ʁ
Filter
Sink
Sinkͱʁ• (෦తʹ)sourceͷobserverʹͳΔͭ• FilterʹFilterSinkɺMapʹMapSinkɺͷΑ͏ʹ΄΅શͯͷOperatorʹରͯ̋̋͠Sink͕ଘࡏ͢Δ
෦తͳಈ͖(subscribe࣌)
Sequence Map Filter Observer
FilterSequence Map Filter Observersubscribe͕ݺΕͨΒrun͕ݺΕΔsubscribe(observer)
FilterSequence Map Filter Observersubscribe(observer)observer͕ͦͷ··͞ΕΔ
FilterSequence Map Filter ObserverobserverΛݩʹFilterSink͕࡞ΒΕΔFilterSink(observer)
FilterSequence Map Filter ObserverFilterSink͕sourceΛsubscribe͢Δsource.subscribe(FilterSink(observer))
MapSequence Map Filter Observersource.subscribe(FilterSink(observer))
MapSequence Map Filter Observersource.subscribe(FilterSink(observer))observerͱͯ͠ɺFilterSink(observer)͕ͬͯ͘Δɻ
MapSequence Map Filter ObserverMapSink(FilterSink(observer))observerΛݩʹFilterSink͕࡞ΒΕΔ
MapSequence Map Filter Observersource.subscribe(MapSink(FilterSink(observer)))MapSink͕sourceΛsubscribe͢Δ
෦తͳಈ͖(on࣌)
MapSinkSequence Map Filter ObserverΠϕϯτ͕ૹग़͞ΕΔMapSink(FilterSink(observer)).on(.Next(2))
MapSinkSequence Map Filter ObserverΠϕϯτ͕selectorʹΑͬͯม͞ΕΔ.Next(2) → .Next(4)
MapSinkSequence Map Filter ObserverΠϕϯτ͕ૹग़͞ΕΔFilterSink(observer).on(.Next(4))
FilterSinkSequence Map Filter ObserverΠϕϯτ͕ૹग़͞ΕΔFilterSink(observer).on(.Next(4))
FilterSinkSequence Map Filter Observer݅νΣοΫ͞ΕΔvalue % 4 == 0
FilterSinkSequence Map Filter ObserverΠϕϯτ͕ૹग़͞ΕΔobserver.on(.Next(4))
·ͱΊsubscribe(MapSink(FilterSink(observer)))Sequence Map Filter Observersubscribe(FilterSink(observer))subscribe(observer)observerΛSinkʹแΈͳ͕ΒsourceΛsubscribe
·ͱΊSequence Map Filter Observerobserver.on(.Next)FilterSink(observer).on(.Next)MapSink(FilterSink(observer)).on(.Next)SinkͰॲཧΛՃ͑ͳ͕ΒobserverʹΠϕϯτΛྲྀ͢
SinkIter
SinkIterͱʁ• mergeflatMapͳͲɺ(গͳ͘ͱ෦తʹ)Observable> Λѻ͏ͱ͖ʹར༻͞ΕΔɻ
SinkIterͱʁObservable>
SinkIterͱʁObservable>֎ଆͷObservableΛsubscribe͢Δͷ͕Sink
SinkIterͱʁObservable>ଆͷObservableΛsubscribe͢Δͷ͕SinkIter
ಡΜͰΈΑ͏ColdͳObservable
ColdͳObservableͷੑ࣭• ͍͔ͭ͋͘Γ·͕͢ɺࠓճʮsubscribe͠ͳ͍ͱಈ࡞͠ͳ͍ʯͱ͍͏ੑ࣭͕ίʔυϨϕϧͰͲ͏࣮ݱ͞Ε͍ͯΔ͔Λ֬ೝͯ͠Έ·͢ɻ• ݴ͍͔͑Εʮsubscribe͞Εͨͱ͖ʹಈ࡞Λ࢝ΊΔʯͰ͢ɻ
Just
Justsubscribe͞ΕΔͱ….
Just͕ૹग़͞ΕΔʂʂʂ
Cold
ColdsubscribeJust Map Filter Observersubscribe subscribeon on on
ಡΜͰΈΑ͏BehaviorSubject
BehaviorSubjectͷੑ࣭• ͍͔ͭ͋͘Γ·͕͢ɺࠓճʮذͰ͖Δʯʮsubscribe࣌ʹલͷ͕औΕΔʯΛ֬ೝͯ͠Έ·͢ɻ
BehaviorSubjectલͷΛอ࣋͢Δม
BehaviorSubjectෳͷobserver
BehaviorSubjectsubscribe͞ΕͨΒݺΕΔ
BehaviorSubjectsubscribe͞ΕͨΒobserverͱͯ͠ొ
BehaviorSubjectલͷΛૹग़
BehaviorSubjectonͰΠϕϯτΛड͚औͬͨͱ͖ʹݺΕΔ
BehaviorSubjectલͷΛߋ৽
BehaviorSubject֤Observerʹૹग़
·ͱΊ• Rxʹଟ͘ͷOperator͕༻ҙ͞Ε͍ͯ·͕͢ɺͦΕΒ΄΅ಉ͡࡞Γʹͳ͓ͬͯΓɺಡΈํ͔͑͞Ε؆୯ʹڍಈΛ֬ೝ͢Δ͜ͱ͕Ͱ͖·͢ɻ• ڍಈʹ͕ࣗͳ͚ΕιʔεΛಡΜͰ֬ೝ͠Α͏ʂ
Ҏ্ʂ