Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RxSwift コードリーディングの勘所@社内RxSwift勉強会

RxSwift コードリーディングの勘所@社内RxSwift勉強会

ukitaka

July 18, 2016
Tweet

More Decks by ukitaka

Other Decks in Programming

Transcript

  1. RxSwift ίʔυϦʔσΟϯάͷצॴ
    @ࣾ಺RxSwiftษڧձ

    View Slide

  2. ͳΜͰίʔυಡΉඞཁ͕͋Δͷʁ
    https://speakerdeck.com/bricklife/rxswiftfalseobserveontosubscribeonwoli-jie-suru

    View Slide

  3. ͳΜͰίʔυಡΉඞཁ͕͋Δͷʁ
    • ެࣜυΩϡϝϯτ΍ RxMarblesͳͲυΩϡϝϯτ
    ͸ॆ࣮͍ͯ͠ΔΑ͏ʹݟ͑Δ͕ɺHotม׵΍Ϛϧν
    εϨουͳͲ͕ؔ܎͖ͯͨ࣌͠ͷڍಈ͸υΩϡϝ
    ϯτΛ௥͏͚ͩͰ͸ཧղ͢Δͷ͸೉͍͠ɻ
    • ·ͨɺRxSwiftಠࣗͷ֓೦΍OperatorͳͲɺ
    ReactiveXͷυΩϡϝϯτʹ͸ॻ͔Ε͍ͯͳ͍͜ͱ
    ΋গ͋͠Δɻ(DriverͳͲ…)

    View Slide

  4. ͜ͷεϥΠυͰ͸
    • ओʹOperatorͷ࣮૷Ͱ޿͘࢖ΘΕ͍ͯΔ֓೦
    ΍ख๏Λઆ໌͠·͢ɻ
    • ͦͷ͋ͱͰ Hot / Cold ͳͲΛྫʹ͋͛ͯɺͲ
    ͏΍࣮ͬͯݱ͞Ε͍ͯΔͷ͔Λઆ໌͠·͢ɻ

    View Slide

  5. ͜ͷεϥΠυͰ͸
    • RxSwift͸ v2.5.0 (2016೥7݄࣌఺Ͱͷmaster)
    Λݟͯ·͢ɻ
    • ͨͿΜόʔδϣϯ1ܥ΍ࠓޙͷόʔδϣϯͰ΋
    ௨༻͢Δ͔͸ෆ໌Ͱ͕͢ɺͨͿΜେ͖͘ζϨ
    Δ͜ͱ͸ແ͍ͱࢥ͍·͢ɻ

    View Slide

  6. צॴ ͦͷ1
    Operatorʹ͓͚Δ
    ʮsourceʯ

    View Slide

  7. View Slide

  8. Sequence Map Filter
    ↑ Α͘Έ͔͚Δਤ

    View Slide

  9. Sequence Map Filter
    ↑ Α͘Έ͔͚Δਤ
    ίʔυ্͸Ͳ͏දݱ͞Ε͍ͯΔʁ

    View Slide

  10. filter

    View Slide

  11. filter
    ࣮ଶ͸Filterͱ͍͏Ϋϥε

    View Slide

  12. filter
    sourceͱͯ͠ɺfilterΛݺͼग़ͨ͠
    ObservableΛ͍࣋ͬͯΔ

    View Slide

  13. map
    Map΋ಉ༷

    View Slide

  14. ͭ·Γ
    source
    Mapͷsource͸Sequence
    (Sequence͸Observable.ofͷ಺෦දݱ)

    View Slide

  15. ͭ·Γ
    source
    Filterͷsource͸Map

    View Slide

  16. ͭ·Γ
    source
    Sequence Map Filter
    source

    View Slide

  17. ͭ·Γ
    source
    Sequence Map Filter
    source
    sourceͷ࿈ͳΓͱ΋ݴ͑Δ

    View Slide

  18. ͱ͜ΖͰɺ
    source
    Sequence Map Filter
    source
    ͜Εͷsource͸ʁ

    View Slide

  19. createܥͷOperatorʹ͸source͸ͳ͍
    • create, just, of, error, never ͳͲɺcreateܥͷ
    Operatorʹ͸source͸ͳ͍ɻ
    • map΍filterͷΑ͏ͳҰൠతͳOperator΍ɺ
    Hotม׵ܥɺsubscribeOn/observeOnʹ͸
    source͕͋Δɻ

    View Slide

  20. createܥͷOperatorʹ͸source͸ͳ͍
    • ͔͜͜Β͸ɺී௨ʹʮOperatorʯͱॻ͍͍ͯ
    ͨΒʮcreateܥҎ֎ͷOperatorʯͷ͜ͱͩͱ
    ࢥ͍ͬͯͩ͘͞ɻ

    View Slide

  21. source͸Ͳ͏࢖ΘΕΔͷʁ
    • source͸ཁ͸ObservableͳͷͰɺద౰ͳλΠ
    ϛϯάͰͦͷsourceΛ(಺෦తʹ) subscribe͠
    ͯΠϕϯτΛड͚औΓ࢝Ί·͢ɻ
    • ͲͷλΠϛϯάͰ(಺෦తʹ)subscribe͕ݺ͹
    ΕΔ͔͸ɺHot / ColdͳͲOperatorͷੑ࣭ʹ
    Αͬͯҧ͖ͬͯ·͢ɻ

    View Slide

  22. sourceʹ͍ͭͯ·ͱΊ
    • createܥҎ֎ͷOperator͸લͷObservableΛ
    sourceͱͯ࣋ͭ͜͠ͱͰɺਤͷΑ͏ͳ࿈ͳΓ
    Λ࣮ݱ͍ͯ͠Δɻ
    source
    Sequence Map Filter
    source

    View Slide

  23. צॴ ͦͷ2
    Operator࣮૷Ͱ
    νΣοΫ͢΂͖఺

    View Slide

  24. Operatorͷ࣮૷ͰͳʹΛΈΔ͔
    ҎԼ͸ͲͷOperatorʹ΋ڞ௨͢Δಈ͖
    • ద౰ͳλΠϛϯάͰsourceΛsubscribe͢Δ
    • source͔Βड͚औͬͨΠϕϯτʹద౰ͳॲཧ
    ΛՃ͑ͯ࣍ʹྲྀ͢

    View Slide

  25. Operatorͷ࣮૷ͰͳʹΛΈΔ͔
    Sequence Map Filter Observer
    subscribe

    View Slide

  26. Operatorͷ࣮૷ͰͳʹΛΈΔ͔
    subscribe
    Sequence Map Filter Observer
    subscribe subscribe
    ಺෦తʹsourceΛsubscribe͢Δ

    View Slide

  27. Operatorͷ࣮૷ͰͳʹΛΈΔ͔
    Sequence Map Filter Observer
    on on on
    ΠϕϯτΛड͚औͬͯॲཧΛՃ͑ͯ࣍ʹྲྀ͢

    View Slide

  28. Operatorͷ࣮૷ͰͳʹΛΈΔ͔
    subscribe
    Sequence Map Filter Observer
    subscribe subscribe
    on on on

    View Slide

  29. Operatorͷ࣮૷ͰͳʹΛΈΔ͔
    ΈΔϙΠϯτ͸3ͭ
    • ͍ͭsourceͷsubscribeΛߦ͏͔
    • subscribe͕ݺ͹ΕͨΒͳʹ͕ى͜Δ͔
    • on͕ݺ͹ΕͨΒͳʹ͕ى͜Δ͔

    View Slide

  30. ྫ: Filter

    View Slide

  31. ྫ: Filter
    run͸subscribe͕ݺ͹Εͨͱ͖ʹݺ͹ΕΔϝιου

    View Slide

  32. ྫ: Filter
    sinkͱ͔͍͏΍͕ͭsourceͷsubscribeΛߦ͍ͬͯΔ

    View Slide

  33. ྫ: Filter
    Sequence Map Filter Observer
    subscribe
    ͭ·Γɺࣗ਎ͷsubscribe͕ݺ͹ΕͨΒ

    View Slide

  34. ྫ: Filter
    Sequence Map Filter Observer
    subscribe subscribe
    sourceͷsubscribeΛߦ͏

    View Slide

  35. ྫ: Filter

    View Slide

  36. ྫ: Filter
    on͸source͔ΒΠϕϯτ͕ྲྀΕ͖ͯͨ࣌ʹݺ͹ΕΔϝιου

    View Slide

  37. ྫ: Filter
    Nextͷ৔߹͸

    View Slide

  38. ྫ: Filter
    ൑ఆ༻ͷؔ਺ʹ஋Λ౉ͯ͠

    View Slide

  39. ྫ: Filter
    ৚݅Λຬ͍ͨͯ͠Ε͹࣍΁ྲྀ͢

    View Slide

  40. ྫ: Filter
    Sequence Map Filter Observer
    on
    source͔ΒΠϕϯτ͕དྷͨΒ

    View Slide

  41. ྫ: Filter
    Sequence Map Filter Observer
    on on
    ൑ఆͨ͠ޙ࣍΁౉͢

    View Slide

  42. ಡΊΔʂ ✌('ω'✌ )ࡾ✌('ω')✌ࡾ( ✌'ω')✌

    View Slide

  43. ·ͱΊ
    ΈΔϙΠϯτ͸3ͭ
    • ͍ͭsourceͷsubscribeΛߦ͏͔
    • subscribe͕ݺ͹ΕͨΒͳʹ͕ى͜Δ͔
    • on͕ݺ͹ΕͨΒͳʹ͕ى͜Δ͔

    View Slide

  44. Subject͸…
    ಉ͘͡3ͭΛΈΔͱڍಈ͕͔ͭΊΔͱࢥ͍·͢ɻ
    • ͍ͭsourceͷsubscribeΛߦ͏͔
    • subscribe͕ݺ͹ΕͨΒͳʹ͕ى͜Δ͔
    • on͕ݺ͹ΕͨΒͳʹ͕ى͜Δ͔

    View Slide

  45. createܥͷOperator͸…
    ͱΓ͋͑ͣɺ
    • subscribe͕ݺ͹ΕͨΒͳʹ͕ى͜Δ͔
    ͜ΕΛݟ͓͚ͯ͹ڍಈ͕Θ͔Δͱࢥ͍·͢ɻ

    View Slide

  46. צॴ ͦͷ3
    Sink / SinkIter

    View Slide

  47. (෮श) Operatorͷಈ͖
    • ద౰ͳλΠϛϯάͰsourceΛsubscribe͢Δ
    • source͔Βड͚औͬͨΠϕϯτʹద౰ͳॲཧ
    ΛՃ͑ͯ࣍ʹྲྀ͢

    View Slide

  48. (෮श) Operatorͷಈ͖
    • ద౰ͳλΠϛϯάͰsourceΛsubscribe͢Δ
    • source͔Βड͚औͬͨΠϕϯτʹద౰ͳॲཧ
    ΛՃ͑ͯ࣍ʹྲྀ͢
    ୭͕subscribe͢Δͷʁobserver͸୭ʁ

    View Slide

  49. Filter

    View Slide

  50. Filter

    View Slide

  51. Filter

    View Slide

  52. Sink

    View Slide

  53. Sinkͱ͸ʁ
    • (಺෦తʹ)sourceͷobserverʹͳΔ΍ͭ
    • Filterʹ͸FilterSinkɺMapʹ͸MapSinkɺͷΑ
    ͏ʹ΄΅શͯͷOperatorʹରͯ̋̋͠Sink͕
    ଘࡏ͢Δ

    View Slide

  54. ಺෦తͳಈ͖
    (subscribe࣌)

    View Slide

  55. Sequence Map Filter Observer

    View Slide

  56. Filter
    Sequence Map Filter Observer
    subscribe͕ݺ͹ΕͨΒrun͕ݺ͹ΕΔ
    subscribe(observer)

    View Slide

  57. Filter
    Sequence Map Filter Observer
    subscribe(observer)
    observer͕ͦͷ··౉͞ΕΔ

    View Slide

  58. Filter
    Sequence Map Filter Observer
    observerΛݩʹFilterSink͕࡞ΒΕΔ
    FilterSink(observer)

    View Slide

  59. Filter
    Sequence Map Filter Observer
    FilterSink͕sourceΛsubscribe͢Δ
    source.subscribe(FilterSink(observer))

    View Slide

  60. Map
    Sequence Map Filter Observer
    source.subscribe(FilterSink(observer))

    View Slide

  61. Map
    Sequence Map Filter Observer
    source.subscribe(FilterSink(observer))
    observerͱͯ͠ɺFilterSink(observer)͕౉ͬͯ͘Δɻ

    View Slide

  62. Map
    Sequence Map Filter Observer
    MapSink(FilterSink(observer))
    observerΛݩʹFilterSink͕࡞ΒΕΔ

    View Slide

  63. Map
    Sequence Map Filter Observer
    source.subscribe(MapSink(FilterSink(observer)))
    MapSink͕sourceΛsubscribe͢Δ

    View Slide

  64. ಺෦తͳಈ͖
    (on࣌)

    View Slide

  65. MapSink
    Sequence Map Filter Observer
    Πϕϯτ͕ૹग़͞ΕΔ
    MapSink(FilterSink(observer)).on(.Next(2))

    View Slide

  66. MapSink
    Sequence Map Filter Observer
    Πϕϯτ͕selectorʹΑͬͯม׵͞ΕΔ
    .Next(2) → .Next(4)

    View Slide

  67. MapSink
    Sequence Map Filter Observer
    Πϕϯτ͕ૹग़͞ΕΔ
    FilterSink(observer).on(.Next(4))

    View Slide

  68. FilterSink
    Sequence Map Filter Observer
    Πϕϯτ͕ૹग़͞ΕΔ
    FilterSink(observer).on(.Next(4))

    View Slide

  69. FilterSink
    Sequence Map Filter Observer
    ৚݅νΣοΫ͞ΕΔ
    value % 4 == 0

    View Slide

  70. FilterSink
    Sequence Map Filter Observer
    Πϕϯτ͕ૹग़͞ΕΔ
    observer.on(.Next(4))

    View Slide

  71. ಡΊΔʂ ✌('ω'✌ )ࡾ✌('ω')✌ࡾ( ✌'ω')✌

    View Slide

  72. ·ͱΊ
    subscribe(MapSink(FilterSink(observer)))
    Sequence Map Filter Observer
    subscribe(FilterSink(observer))
    subscribe(observer)
    observerΛSinkʹแΈͳ͕Β
    sourceΛsubscribe

    View Slide

  73. ·ͱΊ
    Sequence Map Filter Observer
    observer.on(.Next)
    FilterSink(observer).on(.Next)
    MapSink(FilterSink(observer)).on(.Next)
    SinkͰॲཧΛՃ͑ͳ͕Β
    observerʹΠϕϯτΛྲྀ͢

    View Slide

  74. SinkIter

    View Slide

  75. SinkIterͱ͸ʁ
    • merge΍flatMapͳͲɺ(গͳ͘ͱ΋಺෦తʹ)
    Observable> Λѻ͏ͱ͖ʹ
    ར༻͞ΕΔɻ

    View Slide

  76. SinkIterͱ͸ʁ
    Observable>

    View Slide

  77. SinkIterͱ͸ʁ
    Observable>
    ֎ଆͷObservableΛ
    subscribe͢Δͷ͕Sink

    View Slide

  78. SinkIterͱ͸ʁ
    Observable>
    ಺ଆͷObservableΛ
    subscribe͢Δͷ͕SinkIter

    View Slide

  79. ಡΜͰΈΑ͏
    ColdͳObservable

    View Slide

  80. ColdͳObservableͷੑ࣭
    • ͍͔ͭ͋͘Γ·͕͢ɺࠓճ͸ʮsubscribe͠ͳ
    ͍ͱಈ࡞͠ͳ͍ʯͱ͍͏ੑ࣭͕ίʔυϨϕϧ
    ͰͲ͏࣮ݱ͞Ε͍ͯΔ͔Λ֬ೝͯ͠Έ·͢ɻ
    • ݴ͍͔͑Ε͹ʮsubscribe͞Εͨͱ͖ʹಈ࡞Λ
    ࢝ΊΔʯͰ͢ɻ

    View Slide

  81. Just

    View Slide

  82. Just
    subscribe͞ΕΔͱ….

    View Slide

  83. Just
    ஋͕ૹग़͞ΕΔʂʂʂ

    View Slide

  84. Cold

    View Slide

  85. Cold
    subscribe
    Just Map Filter Observer
    subscribe subscribe
    on on on

    View Slide

  86. ಡΜͰΈΑ͏
    BehaviorSubject

    View Slide

  87. BehaviorSubjectͷੑ࣭
    • ͍͔ͭ͋͘Γ·͕͢ɺࠓճ͸ʮ෼ذͰ͖Δʯ
    ʮsubscribe࣌ʹ௚લͷ஋͕औΕΔʯΛ֬ೝ͠
    ͯΈ·͢ɻ

    View Slide

  88. BehaviorSubject
    ௚લͷ஋Λอ࣋͢Δม਺

    View Slide

  89. BehaviorSubject
    ෳ਺ͷobserver

    View Slide

  90. BehaviorSubject
    subscribe͞ΕͨΒݺ͹ΕΔ

    View Slide

  91. BehaviorSubject
    subscribe͞ΕͨΒobserverͱͯ͠ొ࿥

    View Slide

  92. BehaviorSubject
    ௚લͷ஋Λૹग़

    View Slide

  93. BehaviorSubject
    onͰΠϕϯτΛड͚औͬͨͱ͖ʹݺ͹ΕΔ

    View Slide

  94. BehaviorSubject
    ௚લͷ஋Λߋ৽

    View Slide

  95. BehaviorSubject
    ֤Observerʹૹग़

    View Slide

  96. ಡΊΔʂ ✌('ω'✌ )ࡾ✌('ω')✌ࡾ( ✌'ω')✌

    View Slide

  97. ·ͱΊ
    • Rxʹ͸ଟ͘ͷOperator͕༻ҙ͞Ε͍ͯ·͢
    ͕ɺͦΕΒ͸΄΅ಉ͡࡞Γʹͳ͓ͬͯΓɺಡ
    Έํ͑͞෼͔Ε͹؆୯ʹڍಈΛ֬ೝ͢Δ͜ͱ
    ͕Ͱ͖·͢ɻ
    • ڍಈʹࣗ਎͕ͳ͚Ε͹ιʔεΛಡΜͰ֬ೝ͠
    Α͏ʂ

    View Slide

  98. Ҏ্ʂ

    View Slide