マルチスレッドRxSwift @ 社内RxSwift勉強会
ϚϧνεϨουRxSwift@ࣾRxSwiftษڧձ
View Slide
߹ΘͤͯಡΈ͍ͨhttps://https://speakerdeck.com/ukitaka/rxswift-kodorideingufalsekan-suo-at-she-nei-rxswiftmian-qiang-hui/bricklife/rxswiftfalseobserveontosubscribeonwoli-jie-suru
ཁίʔυϦʔσΟϯά• ޙͰৄ͘͠આ໌͠·͕͢ɺʮͲͷεϨουͰsubscribe͕ߦΘΕ͔ͨʯ͕ͱͯॏཁʹͳ͖ͬͯ·͢ɻ• ͜͜Ͱ͍͏subscribe෦తͳsubscribeؚΈ·͢ɻͭ·ΓʮOperator͕͍ͭͲͷεϨουͰsourceΛsubscribe͢Δ͔ʯΛѲ͠ͳ͍ͱɺڍಈΛཧղ͢Δͷ͕͍͜͠ͱ͋Δ͔͠Ε·ͤΜɻ
͜ͷεϥΠυͰ• ·ͣɺRxSwiftͱGCDͳͲͷΈ߹ΘͤʹΑΔϚϧνεϨουڥͰͷڍಈͷ֬ೝͱಈ࡞ϧʔϧͷઆ໌Λߦ͍·͢ɻ• ͦͷޙobserveOnɺsubscribeOnͷڍಈͷઆ໌Λߦ͍·͢ɻ
͜ͷεϥΠυͰ• ϚϧνεϨουͱ͍ͬͯɺଟ͘ͷiOS։ൃऀ͕ڵຯ͕͋ΔͷʮϝΠϯεϨουʯ͔ʮͦΕҎ֎͔ʯͩͱࢥ͍·͢ɻ• ͜ͷεϥΠυͰɺʮϝΠϯεϨουͰͳ͍εϨουʯΛ·ͱΊͯʮόοΫάϥϯυεϨουʯͱݺͿ͜ͱʹͯ͠ɺϝΠϯεϨου͔όοΫάϥϯυεϨου͔ͷΈʹ͠·͢ɻ• ͭ·ΓόοΫάϥϯυεϨουෳ͋Γɺ࣮ࡍʹͲͷεϨουͰॲཧ͞ΕΔ͔ɺ(RxSwift͕෦తʹར༻͍ͯ͠Δ) GCDNSOperationQueueʹґଘ͢Δ͜ͱʹҙ͍ͯͩ͘͠͞ɻ
͜ͷεϥΠυͰ• RxSwift v2.5.0 (20167݄࣌Ͱͷmaster)Λݟͯ·͢ɻ• ͨͿΜόʔδϣϯ1ܥࠓޙͷόʔδϣϯͰ௨༻͢Δ͔ෆ໌Ͱ͕͢ɺͨͿΜେ͖͘ζϨΔ͜ͱແ͍ͱࢥ͍·͢ɻ
લฤObservableͱεϨου
ಈ࡞ϧʔϧ
ϧʔϧͦͷ1௨ৗͷColdͳOperatorsubscribe͞ΕͨεϨουͰsubscribeon͞ΕͨεϨουͰonΛݺͿɻ
ϧʔϧͦͷ1(ଓ͖)ಛʹSchedulerͷࢦఆͳͲ͕ͳ͍߹ɺcreateܥOperatorsubscribeͨ͠εϨουͰonΛݺͿɻ
ݴ༿͚ͩͩͱΑ͘Θ͔ΒΜ
Sequence Observer
Sequence ObserversubscribeϝΠϯεϨουόοΫάϥϯυεϨου
Sequence ObserversubscribeϝΠϯεϨουόοΫάϥϯυεϨουon
Question1Ͳ͜ͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
MapͲͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
Answerਖ਼ղ…
A. όοΫάϥϯυεϨου
ղઆSequence Map ObserversubscribeϝΠϯεϨουόοΫάϥϯυεϨου
ղઆsubscribeSequence Map ObserversubscribeϝΠϯεϨουόοΫάϥϯυεϨουݺΕͨεϨουͰ෦తʹsourceͷsubscribeΛߦ͏ɻ
ղઆsubscribeSequence Map ObserversubscribeϝΠϯεϨουόοΫάϥϯυεϨουsubscribe͕ݺΕͨεϨουonΛݺͿ
ղઆsubscribeSequence Map ObserversubscribeonϝΠϯεϨουόοΫάϥϯυεϨουon
Question2Ͳ͜ͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
ղઆSequence Map ObserverPublish
ղઆSequence Map ObserverPublishsubscribe
ղઆSequence Map ObserversubscribePublishsubscribe
ղઆsubscribeSequence Map ObserversubscribePublishsubscribe
ղઆsubscribeSequence Map ObserversubscribePublishsubscribesubscribe͕ݺΕͨεϨουonΛݺͿ
ղઆsubscribeSequence Map Observersubscribeon onPublishsubscribeon
(ิ) ղઆsubscribeSequence Map Observersubscribeon onPublishsubscribeonಛʹઆ໌ͯ͠ͳ͔͕ͬͨɺSubjecton͞ΕͨεϨουͰonΛݺͿ
Question3Ͳ͜ͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
ղઆ• refCount() ʮHot͕ͩɺ࠷ॳʹsubscribe͞ΕΔ·Ͱಈ࡞͠ͳ͍ʯͱ͍͏ڍಈɻͭ·Γ࠷ॳʹsubscribe͕ݺΕͨεϨου͕ॏཁɻ• ࠓճ࠷ॳʹsubscribeΛݺΜͰ͍Δͷ͕όοΫάϥϯυεϨουͳͷͰόοΫάϥϯυͰಈ࡞͢Δɻ
(࠶ܝ) ϧʔϧͦͷ1௨ৗͷColdͳOperatorsubscribe͞ΕͨεϨουͰsubscribeon͞ΕͨεϨουͰonΛݺͿɻ
(࠶ܝ) ϧʔϧͦͷ1(ଓ͖)ಛʹSchedulerͷࢦఆͳͲ͕ͳ͍߹ɺcreateܥOperatorsubscribeͨ͠εϨουͰonΛݺͿɻ
࣍ͷϧʔϧ…
ϧʔϧͦͷ2createܥͷOperatorʹScheduler͕ࢦఆ͞Ε͍ͯΔ߹ɺsubscribe͢ΔͱͦͷScheduler্ͰonΛݺͿɻͭ·ΓɺͲͷεϨουͰsubscribe͞Ε͔ͨؔͳ͍ɻ(͍)
Scheduler• createܥͷOperatorʹɺSchedulerΛࢦఆͰ͖Δͷ͕͋Δɻ
Scheduler• Scheduler͕ࢦఆ͞Ε͍ͯΔ߹ʹͲ͏͍͏ڍಈʹͳΔ͔ɺͱ͍͏ͷ͕ࠓճͷϧʔϧ
Scheduler͕ࢦఆ͞Ε͍ͯΔ
ͭ·Γ• Scheduler͕ࢦఆ͞Ε͍ͯΔ߹Ͳ͜ͰsubscribeΛݺ΅͏͕ɺࢦఆ͞ΕͨScheduler(εϨου)ͰonΛݺͿɻ
Question4Ͳ͜ͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
֤.Next, .CompletedͲͷεϨουͰon͞ΕΔͰ͠ΐ͏ʁ
A. حόοΫάϥϯυεϨουۮϝΠϯεϨου.Completedෆఆ
ղઆ• .Nextʹ͍ͭͯ͑؆୯Ͱ͕͢ɺ୭͕Ͳ͏ಈ͍͍ͯΔͷ͔ΠϝʔδͰ͖ΔͱΑΓྑ͍ͱࢥ͍·͢ɻ• ͭ·ΓMergeSinkIter͕subscribeΛ͢Δ →Scheduler͕ࢦఆ͞Ε͍ͯΔͷͰͦͷεϨουͰon͕ݺΕͯobserverʹ͢ͱ͍͏͜ͱͰ͢ɻ
ղઆ• .CompletedෆఆͰ͢ɻෳͷqueueʹdispatch͍ͯ͠ΔͷͰɺ࠷ޙʹྲྀΕ͖ͯͨ.Next͕ͲͷεϨου͔ͩͬͨͰ.Completed͕ྲྀΕͯ͘ΔεϨου͕มΘΓ·͢ɻ• ·͊ී௨͜Μͳ͍ํ͠ͳ͍ͱࢥ͍·͕͢…
Question5Ͳ͜ͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
Replay͞ΕΔ.Next1. .NextΛ࠷ॳʹܭࢉͨ͠εϨου2. subscribeͨ͠εϨουͲͪΒͰྲྀΕͯ͘ΔͰ͠ΐ͏ʁ
A. subscribeͨ͠εϨου
ղઆ• replaysubscribe͞ΕͨεϨουͰߦΘΕ·͢ɻ• ·͊ͦΕ͚ͩͰ͢ɻɻɻ
(࠶ܝ) ϧʔϧͦͷ2createܥͷOperatorʹScheduler͕ࢦఆ͞Ε͍ͯΔ߹ɺsubscribe͢ΔͱͦͷScheduler্ͰonΛݺͿɻͭ·ΓɺͲͷεϨουͰsubscribe͞Ε͔ͨؔͳ͍ɻ(͍)
ObservableͱεϨουʹؔ͢Δϧʔϧ1. ௨ৗͷColdͳOperatorsubscribe͞ΕͨεϨουͰsubscribeɺon͞ΕͨεϨουͰonΛݺͿɻಛʹSchedulerͷࢦఆͳͲ͕ͳ͍߹ɺcreateܥOperatorsubscribeͨ͠εϨουͰonΛݺͿ2. createܥͷOperatorʹScheduler͕ࢦఆ͞Ε͍ͯΔ߹ɺsubscribe͢ΔͱͦͷScheduler্ͰonΛݺͿɻͭ·ΓɺͲͷεϨουͰsubscribe͞Ε͔ͨؔͳ͍ɻ
ޙฤobserveOn, subscribeOn
observeOn, subscribeOn• ͔͜͜ΒScheduler(εϨου)Λมߋ͢ΔͨΊͷOperator observeOn, subscribeOnʹ͍ͭͯݟ͍͖ͯ·͕͢ɺ͜͜·Ͱͷ͕ͳΜͱͳ͘ཧղͰ͖͍ͯΕಛʹ͘͠ͳ͍ͱࢥ͍·͢ɻ
observeOnon͢ΔScheduler(εϨου)Λมߋ͢Δ
subscribeOnsubscribe͢ΔScheduler(εϨου)Λมߋ͢Δ
ͦͷ··ʂʂ
ղઆSequence Map ObserversubscribeonϝΠϯεϨουόοΫάϥϯυεϨουobserveOn.observeOn(backgroundScheduler)subscribe subscribeonon
ղઆSequence Map ObserversubscribeϝΠϯεϨουόοΫάϥϯυεϨουsubscribeOn.subscribeOn(backgroundScheduler)subscribeonononsubscribe
observeOn• observeOnʹ͍ͭͯɺͦΕΑΓલͷจ຺ʹؔͳ͑͘ΔͷͰɺಛʹ͍͜͠ͱΛߟ͑ͣʹʮΠϕϯτ͕ྲྀΕͯ͘ΔεϨουΛม͍͑ͨʂʯͱ͍͏ͱ͖ʹ͑Δͱࢥ͍·͢ɻ
subscribeOn• subscribeOnʹ͍͔ͭͯͳΓ෦ͷಈ͖ʹґଘ͠·͕͢ɺཁલฤͰΈͨ௨ΓͰɺͬ͘͟Γݴͬͯ͠·͑ҎԼಉ͡Ͱ͢ɻ
subscribeOn• લͷจ຺ʹ͔ͳΓґଘ͢ΔͷͰɺͦͦsubscribeOn͕ޮ͔ͳ͍͜ͱ͢Β͋Γ·͢ɻ• ͍υίϩͱͯ͠ɺcreateܥͷOperatorͷޙʹॻ͍͓͍ͯͯͦͷScheduler(εϨου)Ͱ͔͠ಈ࡞͠ͳ͍ObservableΛ࡞Δ͜ͱ͕Ͱ͖·͢ɻ
Question6Ͳ͜ͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
ͦΕͧΕͷMapͲͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
ղઆsubscribeϝΠϯεϨουόοΫάϥϯυεϨουsubscribeonononsubscribeSequence Map ObserversubscribeOn Mapsubscribeon
Question7Ͳ͜ͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
A. ϝΠϯεϨου
ղઆsubscribeϝΠϯεϨουόοΫάϥϯυεϨουsubscribesubscribeSequence Map ObserversubscribeOn Mapsubscribe
ղઆsubscribeϝΠϯεϨουόοΫάϥϯυεϨουsubscribesubscribeSequence Map ObserversubscribeOn MapsubscribeSequenceMainSchedulerͰಈ࡞͢Δɻ
ղઆsubscribeϝΠϯεϨουόοΫάϥϯυεϨουsubscribesubscribeSequence Map ObserversubscribeOn Mapsubscribeon on on on
Question8Ͳ͜ͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
ղઆ• (ུ)
(࠶ܝ) observeOnon͢ΔScheduler(εϨου)Λมߋ͢Δ
(࠶ܝ) subscribeOnsubscribe͢ΔScheduler(εϨου)Λมߋ͢Δ
͓·͚Driver
Driver• DriverRxCocoa͕ఏڙ͍ͯ͠ΔɺUIͱͭͳ͛Δͱ͖ʹྑ͍ײ͡ʹͬͯ͘ΕΔศརͳObservableతͳ͛͢ʔͭɻ(ޠኮྗ)• ࡉ͔͍ੑ࣭͍Ζ͍Ζ͋ΔΜͰ͕͢ɺεϨουपΓͷੑ࣭ʹ͍ͭͯݟͯΈ·͢ɻ
Driverͷ࡞Γํ• createܥͷOperatorΛར༻͢Δ• Observable͔Βม͢Δ
createܥͷOperatorΛར༻͢Δ• Driverʹಉ͡Α͏ʹcreate, just, ofͳͲͷOperator͕ଘࡏ͢Δɻ• ίʔυΛಡΉͱΈ؆୯ͰɺϝΠϯεϨουͰsubscribe͕͞ΕΔΑ͏ʹsubscribeOnΛݺΜͰ͍Δ͜ͱ͕Θ͔Δɻ
createܥͷOperatorΛར༻͢Δ
Observable͔Βม͢Δ• asDriverͰObservableΛDriverʹͰ͖Δ• ͬͪ͜؆୯ͰɺobserveOnͰϝΠϯεϨουͰಈ࡞͢ΔΑ͏ʹ͍ͯ͠Δɻ
Observable͔Βม͢Δ
drive, driveNext• Driver ʹ subscribe ͕ͳ͘ɺ୯७ʹΘΓʹdrive driveNext ͳͲΛར༻͢Δɻ• 1͚ͭͩҙ͕͋ͬͯɺ͜ΕΒϝΠϯεϨουͰ͔͠ݺͳ͍ɻ
drive, driveNext
DriverͷOperatorʹ͍ͭͯ• mapͳͲɺ௨ৗͷOperator͍͍ͩͨҰ௨Γ༻ҙ͞Ε͍ͯΔɻ• ͜ΕΒΛݺΜͰಛʹεϨουʹӨڹͳ͍ɻ• driveOnSchedulerͱ͍͏Operator͕͋Δ͕ɺ͜Εςετ༻ͳͷͰΘͳ͍Α͏ʹɻ
Question9Ͳ͜ͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
A. Τϥʔ
ղઆ• driveϝΠϯεϨου͔Β͔͠ݺ·ͤΜɻ(ͻ͔͚ͬʣ
Question10Ͳ͜ͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
ղઆϝΠϯεϨουόοΫάϥϯυεϨουsubscribeSequence Map Observerdriveon on
Question11Ͳ͜ͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁ
MapͲͷεϨουͰಈ࡞͢ΔͰ͠ΐ͏ʁObserverʹͲͷεϨουͰΠϕϯτ͕ಧ͘Ͱ͠ΐ͏ʁ
A. mapόοΫάϥϯυobserverϝΠϯ
ղઆϝΠϯεϨουόοΫάϥϯυεϨουsubscribeSequence Map Observerdriveonon
͓·͚ ͦͷ2NSURLSession+Rx
NSURLSession+Rx• rx_responserx_JSONόοΫάϥϯυεϨουͰonΛݺΜͰ͘ΔͷͰɺωοτϫʔΫ→ UI ΛΔͱ͖ؾΛ͚ͭΑ͏ɻ
·ͱΊ
observeOn, subscribeOn1. subscribeOnsubscribe͢ΔScheduler(εϨου)Λมߋ͢Δɻ2. observeOnon͢ΔScheduler(εϨου)Λมߋ͢Δɻ
Ҏ্ʂʂ