今日こそ理解するHot変換
ࠓͦ͜ཧղ͢ΔHotม@ࣾRxSwiftษڧձ
View Slide
https://speakerdeck.com/ukitaka/cold-at-she-nei-rxswiftmian-qiang-huiલճͷଓ͖
Hotม
Cold → Hot
(෮श)Hotʹؔ࿈͢ΔΦϖϨʔλHotʹؔ࿈͢ΔΦϖϨʔλҎԼͷΈɻ͜ΕΒ͕ಛʹݺΕͯͳ͚ΕHotʹม͞ΕΔ͜ͱͳ͍ɻ• multicast / publish• replay / replayAll• connect / refCount• share / shareReplay• shareReplayLatestWhileConnected
·͊ͱΓ͋͑ͣͬͯΈΔ͔
publish()
Question1ͳΜͱදࣔ͞ΕΔͰ͠ΐ͏ʁ
͜Μͳͷ؆୯͡ΌΜʂ1,2,3Ͱ͠ΐʂ
͜Μͳͷ؆୯͡ΌΜSequence Map HotsubscribeՔಇ
Answerਖ਼ղ…
A. ͳʹදࣔ͞Εͳ͍
!?
(෮श)Hotʹؔ࿈͢ΔΦϖϨʔλHotʹؔ࿈͢ΔΦϖϨʔλҎԼͷΈɻ͜ΕΒ͕ಛʹݺΕͯͳ͚ΕHotʹม͞ΕΔ͜ͱͳ͍ɻ• multicast / publish• replay / replayAll• connect / refCount• share / shareReplay• shareReplayLatestWhileConnectedؚΈͷ͋Δݴ͍ํ
Hotม ϙΠϯτͦͷ1ConnectableObservable
ͭ͡publish()ͷฦΓ…
ConnectableObservable• connect() ϝιουΛ࣋ͭ• connect() ΛݺͿ͜ͱͰHotʹมྃ͢Δ• connect() ΛݺͿ·ͰObserver͕͍Α͏͕͍·͍͕ಈ࡞͠ͳ͍
ConnectableObservable
ͳΜͰඞཁͳͷʁ• ྫ͑ɺෳͷobserver͕Hotม͞ΕͨετϦʔϜͷΛ࠷ॳ͔ΒͪΌΜͱड͚औΓ͍ͨ࣌ɻconnect()ΛݺͿ·Ͱಈ࡞͠ͳ͍ͷͰɺͦͷؒʹશͯͷobserverΛsubscribe͓ͤͯ͘͜͞ͱ͕Ͱ͖Δɻ
ͳΜͰඞཁͳͷʁ(ConnectableObservable͕ແ͍ͱͲ͏ͳΔ͔ߟ͑ͯΈ͍ͯͩ͘͞)
ConnectableObservableΛฦ͢Operator• multicast()• publish()• replay(bufferSize:)• replayAll()
multicast()• ͦͦHotมͱɺ෦తʹSubjectΛར༻͍ͯ͠Δ͚ͩͰ͋Δɻ• multicast()SubjectΛࢦఆͯͦ͜͠ͰҰ୴ΠϕϯτΛड͚ΔΑ͏ʹ͢ΔOperator
multicast()
publish()• PublishSubjectʹmulticast͢Δ
• ReplaySubjectʹmulticast͢Δreplay(bufferSize:) / replayAll()
ConnectableObservable·ͱΊ• ColdͳObservableʹରͯ͠ɺmulticast() /publish() / replay(bufferSize:) / replayAll() Λݺͼग़͢͜ͱͰ ConnectableObservableʹมͰ͖Δɻ• ConnectableObservableʹରͯ͠connect()Λݺͼग़͢͜ͱͰHotͳObservableʹม͕ྃ͢Δɻ
࣍…
ConnectableObservableཧղͨ͠
ଞͷHotؔ࿈ͷOperatorʁ
ͱΓ͋͑ͣshare()ͰͬͯΈΔ͔
share()ConnectableObservable͡Όͳͯ͘ObservableͰฦ͖ͬͯͯΔ͖ͬ͠ͱHotΖʂʂʂ
Question2ͳΜͱදࣔ͞ΕΔͰ͠ΐ͏ʁ
ƅЧƅ)Űō?
Hotม ϙΠϯτͦͷ2ۂऀ: RefCount
share()
refCount()• refCount() ConnectableObservableʹରͯ͠ݺΔ͏ҰͭͷOperatorͰ͋Δɻ
refCount()• Hotͷ֓೦Λ෴͢ΊΜͲ͍͘͞ศརͳͭ• Hotͷੑ࣭ͱͯ͠ʮsubscribe͠ͳͯ͘ಈ࡞͢Δʯͱ͍͏ͷ͕͋Δ͕ɺrefCount͕ڬ·ΔͱʮHot͕ͩɺ࠷ॳʹsubscribe͞ΕΔ·Ͱಈ࡞͠ͳ͍ʯΈ͍ͨͳڍಈʹͳΔɻ
refCount()• ࡞Γ୯७Ͱɺ࠷ॳʹsubscribe͞Εͨ࣌Ͱ෦తʹconnect()ΛݺͿɻ
Question3ͳΜͱදࣔ͞ΕΔͰ͠ΐ͏ʁ
A. 1,2,3
ͪΌΜͱHotม͞Εͯͨ(ͳΜͰʁʂͱࢥͬͨํલճͷεϥΠυΈͯΈ·͠ΐ͏)
ΓͷOperator
shareReplay(bufferSize:)• ໊લͷ௨Γɺshare + replay• share = publish + refCount• shareReplay = publish + refCount + replay• ʮHot͕ͩɺ࠷ॳʹsubscribe͞ΕΔ·Ͱಈ࡞͠ͳ͍ʯΛकΓͭͭࢦఆ͞Εͨݸ͚ͩΛreplay͢Δ
shareReplay(bufferSize:)• ࣮ΊͬͪΌॏཁͰɺRxSwiftͷExampleͰΑ͘ʢʁʣΘΕ͍ͯΔɻ• มతʹѻ͍ͭͭɺ࠶ܭࢉͤ͞ͳ͍Α͏ʹ͢Δͱ͖ʹshareReplay(1)Λ͚ͭΔͱΑ͍ (͜Εʹ͍ͭͯผ్ൃද͠·͢ɻ)• RxSwift v2.5.0࣌ͰshareReplayʹ1Ҏ֎Λ͢ͱ࠶ܭࢉ͕Δόάʁ༷ʁ͕͋Δɻshareಉ༷ͷݱ༗Γɻ
shareReplayLatestWhileConnected()• ໊લ͕ΊͬͪΌ͍• ͜Μͳͷ͏ػձ͋Δͷʁͱࢥ͏͔͠Εͳ͍͕ɺRxSwift(RxCocoa)Ͱఏڙ͞Ε͍ͯΔ DriverσϑΥϧτͰ͜Εͱಉ͡ڍಈΛ͢ΔɻͳͷͰڍಈཧղ͓͖ͯ͘͠ɻ• ShareReplay1 ͱͷҧ͍ɺconnect தͰͳ͍ͱ࠷ޙͷ͕औΕͳ͍͜ͱɻͭ·Γ1 .Completed ͕ྲྀΕͨΒͦͷ͋ͱʹreplay͞Εͣɺ.Completed ͔͠ྲྀΕͯ͜ͳ͍ɻ• ڍಈͷৄࡉͳྫDriverͷͱ͖ʹઆ໌͢ΔͷͰ͜͜ͰׂѪɻ
Hotม·ͱΊHotʹม͢Δʹ• ConnectableObservableʹมޙɺconnect()ΛݺͿ• RefCountʹରͯ͠1ͭҎ্subscribeΛߦ͏
Ҏ্ʂʂ