Slide 1

Slide 1 text

Dive to Reactive Extension with Swift 2016/11/22 Kei Takahashi Make It Real Inc.

Slide 2

Slide 2 text

ΞδΣϯμ ▸ Reactive Extensionͱ͸ ▸ αϯϓϧΞϓϦ ▸ Deep dive to Rx ▸ ϥΠϒϥϦ ※αϯϓϧίʔυ౳Ͱ࢖༻͢Δݴޠ, ࣮૷ܥ͸Swift3.0.1 + RxSwift(3.0.0-rc.1)Λ࢖༻͢Δ ※αϯϓϧίʔυ͕େྔʹͳͬͨͷͰɺαϯϓϧίʔυͱ߹ΘͤͯӾཡΛਪ঑͢Δ

Slide 3

Slide 3 text

Reactive Extension ͱ͸

Slide 4

Slide 4 text

Reactive Extensionͱ͸ Microsoftͷ.NET Framework͕ൃ঵ Α͘આ໌͞ΕΔͷ͕ Rx = Observables + LINQ + Schedulers ͱ͍͏ߟ͑ํ

Slide 5

Slide 5 text

Reactive Extensionͱ͸ Rx = Observables + LINQ + Schedulers ▸ Observables: Observer PatternͰ࣮૷͞Εͨ࣌ܥྻͰൃੜ͢Δσʔλू ߹ ▸ LINQ: ओʹ.NET FrameworkͰར༻Մೳͳσʔλू߹ʹରͯ͠ΫΤϦϯ άΛߦ͏࢓૊Έ(RxͰ͸Operatorͱݺ͹ΕΔ) ▸ Schedulers: ͍ͭ, Ͳ͜Ͱ஋Λൃੜ, ॲཧ, ߪಡ͢Δ͔Λѻ͏εέδϡʔϥ ೚ҙͷεέδϡʔϥͰɺ࣌ܥྻͰൃੜ͢Δσʔλू߹(Stream)ʹ ରͯ͠ΫΤϦΛൃߦ͠ɺ݁ՌΛߪಡ͢Δ ͜ͱ͕Ͱ͖Δ࢓૊Έ

Slide 6

Slide 6 text

Reactive Extensionͱ͸ Stream ͜ͷɺ࣌ܥྻͰൃੜ͢Δσʔλू߹Λ ετϦʔϜ (Stream) ͱݺͿ ※จ຺ʹΑͬͯσʔλετϦʔϜ, ΠϕϯτετϦʔϜ, γʔέϯε, ઒ͱ΋

Slide 7

Slide 7 text

Reactive Extensionͱ͸ Marble Diagrams RxͰͷಈ࡞ΛਤͰදͨ͠΋ͷ http://reactivex.io/assets/operators/legend.png ※ASCII ArtͰද͞ΕΔ৔߹΋͋Δ

Slide 8

Slide 8 text

Reactive Extensionͱ͸ ͜͜·Ͱͷ·ͱΊ ▸ Rx = Observables + LINQ + Schedulers ▸ ࣌ܥྻͰൃੜ͢Δσʔλू߹ΛετϦʔϜͱݺͿ ▸ Rxͷಈ࡞͸Marble DiagramsͰද͞ΕΔ

Slide 9

Slide 9 text

Reactive Extensionͱ͸ ͳΔ΄Ͳʁ

Slide 10

Slide 10 text

αϯϓϧ ΞϓϦ

Slide 11

Slide 11 text

αϯϓϧΞϓϦ Github Repository Search APIͰݕࡧΛߦ͍ɺ݁ՌΛදࣔ͢Δ ▸ ೖྗจࣈΛݕࡧϫʔυͱͯ͠ɺGithubͷRepository Search APIΛ call͢Δ ▸ Ϩεϙϯεσʔλ͔ΒɺϦϙδτϦ໊ͷҰཡΛऔಘ͠ɺ TableViewʹදࣔ͢Δ ▸ ΤϥʔͳͲͷҟৗܥ͸Ұ୴ߟྀ͠ͳ͍

Slide 12

Slide 12 text

αϯϓϧΞϓϦ Rxͳ͠Ͱߟ͑ͯΈΔ ▸ UISearchBarͷೖྗΛdelegateͰ؂ࢹ… ▸ APIΛcall͗ͯ͢͠͠·Θͳ͍Α͏ʹ… ▸ ೖྗ͕ॏෳ͍ͯ͠Δ৔߹͸APIΛcall͠ͳ͍Α͏ʹ… ▸ APIୟ͍ͯσʔλ͕ἧͬͨΒUITableViewΛreload… ߟྀ͢Δ͜ͱ͸ΘΓͱଟ͍

Slide 13

Slide 13 text

αϯϓϧΞϓϦ Rx͋ΓͰߟ͑ͯΈΔ - ֓೦ฤ ▸ UISearchBarͷೖྗΛObservableͰड͚Δ ▸ .throttle() OperatorͰೖྗΛؒҾ͘ ▸ .distinctUntilChanged() OperatorͰॏෳೖྗΛ๷ࢭ ▸ ೖྗΛURLSession.rx.json(url)ͰϦΫΤετ͠ɺ݁ՌͷObservableΛड͚औΔ ▸ ݁ՌͷετϦʔϜΛtableViewʹbind͠ɺObservableͷ݁ՌʹΑͬͯ tableView͕ߋ৽͞ΕΔΑ͏ʹ͢Δ ObservableͱOperator(֤छૢ࡞Λߦ͏ϝιου)Λ༻͍Δͱ ͜ͷΑ͏ʹߟ͑ɺ࣮૷Ͱ͖Δ

Slide 14

Slide 14 text

αϯϓϧΞϓϦ Rx͋ΓͰߟ͑ͯΈΔ - αϯϓϧίʔυ https://github.com/dameleon/rxswift-simple-github-repository-search/blob/master/ SimpleGithubRepositorySearch/ViewController.swift

Slide 15

Slide 15 text

αϯϓϧΞϓϦ ͜͜·Ͱͷ·ͱΊ ▸ ೖྗ΍ϨεϙϯεͳͲͷΠϕϯτΛετϦʔϜ(Observable)ͱͦ͜ʹྲྀ ΕΔ஋ͱͯ͠ѻ͏ ▸ ֤Observableʹରͯ͠ɺOperatorΛ༻͍ͯॲཧΛߦ͍ͬͯ͘ ▸ RxSwiftͰ͸ɺRxCocoaͱ͍͏ϑϨʔϜϫʔΫͰUIKitͳͲͷϑϨʔϜ ϫʔΫʹextension͕௥Ճ͞ΕɺObservableͳ஋Λѻ͏͜ͱ͕Ͱ͖ΔΑ ͏ʹͳΔ

Slide 16

Slide 16 text

αϯϓϧΞϓϦ ͳΔ΄Ͳʁ

Slide 17

Slide 17 text

Deep dive to Rx

Slide 18

Slide 18 text

Deep dive to Rx Observableͷੜ੒ͱߪಡ(Observable.create) ObservableΛੜ੒͠ɺObserverʹରͯ͠஋ΛൃߦɺσʔλΛߪಡ͢Δ http://reactivex.io/documentation/operators/images/create.c.png αϯϓϧίʔυ: https://gist.github.com/dameleon/ 9fc3178aaba1f695455234af40730a03#observableͷੜ੒ͱߪಡobservablecreate

Slide 19

Slide 19 text

Deep dive to Rx Observableͷੜ੒ͱߪಡ(Observable.create) - Τϥʔ ObservableΛੜ੒͠ɺObserverʹରͯ͠஋ͱΤϥʔΛൃߦɺσʔλΛߪಡ ͢Δ αϯϓϧίʔυ: https://gist.github.com/dameleon/9fc3178aaba1f695455234af40730a03#ΤϥʔΛ ൃੜͤ͞Δ

Slide 20

Slide 20 text

Deep dive to Rx Observableͷੜ੒ͱߪಡ(Observable.create) - ·ͱΊ ▸ Observable ▸ Elementܕͷ஋ʹରͯ͠ɺΫΤϦ, ߪಡΛߦ͏ͨΊͷΫϥε (جఈprotocol͸ObservableConvertibleType) ▸ Streamͷ࣮ମ ▸ ༷ʑͳOperatorΛඋ͑Δ ▸ ΫΤϦ: map, flatMap, take, filter… ▸ ߪಡ: subscribe, bindTo…

Slide 21

Slide 21 text

Deep dive to Rx Observableͷੜ੒ͱߪಡ(Observable.create) - ·ͱΊ ▸ AnyObserver ▸ ֤छ஋, ΠϕϯτΛൃߦ͢ΔͨΊͷΫϥε(جఈprotocol͸ ObserverType) ▸ onNext(element: Element), onError(error: Error), onCompleted()ͷϝιουΛඋ͑Δ

Slide 22

Slide 22 text

Deep dive to Rx Observableͷੜ੒ͱߪಡ(Observable.create) - ·ͱΊ ▸ Disposable ▸ ߪಡͷഁغΛߦ͏ͨΊͷϝιουΛఆٛͨ͠protocol ▸ subscribe()ͷ໭Γ஋͸DisposableͰɺdispose()Λcall͢ Δ͜ͱʹΑΓߪಡͷഁغΛߦ͏͜ͱ͕Ͱ͖Δ

Slide 23

Slide 23 text

Deep dive to Rx Observableͷੜ੒ͱߪಡ(Observable.create) - ·ͱΊ ▸ ObservableͷϥΠϑαΠΫϧ ▸ onError(error: Error)ͱonCompleted()͕௨஌͞Εͨ Observable͸׬ྃঢ়ଶʹͳΓɺͦͷޙ͸஋, Π ϕϯτΛྲྀ͢͜ͱ͸Ͱ͖ͳ͍

Slide 24

Slide 24 text

Deep dive to Rx Observableͷੜ੒ͱߪಡ(PublishSubject) PublishSubjectΛ༻͍ͯ஋ΛൃߦɺσʔλΛߪಡ͢Δ αϯϓϧίʔυ: https://gist.github.com/dameleon/ 9fc3178aaba1f695455234af40730a03#observableͷੜ੒ͱߪಡpublishsubject http://reactivex.io/documentation/operators/images/S.PublishSubject.png

Slide 25

Slide 25 text

Deep dive to Rx Observableͷੜ੒ͱߪಡ(PublishSubject) - ·ͱΊ ▸ PublishSubject ▸ ObservableType, ObserverTypeͷͲͪΒͷੑ࣭΋උ͑ͨΫϥ ε(= ஋, Πϕϯτͷൃੜ, ߪಡΛͲͪΒ΋ߦ͑Δ)Λ”Subject” ͱݺͿ ▸ PublishSubject͸લड़ͷMarble Diagramsͷ௨ Γɺon(Next|Error|Completed)Λߦ͏ͱɺͦͷ࣌఺Ͱͷશͯ ͷSubscriberʹͦͷ௨஌Λߦ͏Subject ▸ “Subject”ʹ͸ଞʹ΋ReplaySubject, VariableͳͲ͕͋Δ

Slide 26

Slide 26 text

Deep dive to Rx Observableͷੜ੒ͱߪಡ(PublishSubject) - ·ͱΊ ▸ DisposeBag ▸ DisposeBagͷΠϯελϯε͕dealloc͞ΕΔࡍʹɺొ࿥͞ ΕͨDisposableͳΠϯελϯεΛશͯdispose()͢ΔΫϥ ε ▸ ৄࡉ͸ޙड़

Slide 27

Slide 27 text

Deep dive to Rx Observableͷੜ੒ͱߪಡ Observable.create PublishSubject ͦͷҧ͍͸ʁ

Slide 28

Slide 28 text

Deep dive to Rx Observableͷੜ੒ͱߪಡ ▸ Observable.create: Cold Observable ▸ PublishSubject: Hot Observable

Slide 29

Slide 29 text

Deep dive to Rx Hot, Cold Observable - ͱ͸ Observableʹ͸ɺHot, Cold ͱ͍͏ 2ͭͷੑ࣭͕͋Γɺ֤Operator͸ඞͣͲͪΒ͔ͷੑ࣭Λඋ͑ͨ ObservableΛੜ੒͢Δ

Slide 30

Slide 30 text

Deep dive to Rx Hot, Cold Observable - ͱ͸ Cold Observable Hot Observable ஋ͷൃߦ subscribe()࣌ ਵ࣌ Streamͷ෼ذ ͠ͳ͍ ͢Δ ্ྲྀʹର͢ΔӨڹ ͳ͠ ্ྲྀͷCold Observableͷ஋ Λཁٻ͢Δ

Slide 31

Slide 31 text

Deep dive to Rx Hot, Cold Observable - ஋ͷൃߦ, Streamͷ෼ذ Observable.createͷྫʹɺ஋ͷൃߦ࣌ؒΛ෇Ճ͢Δ https://gist.github.com/dameleon/9fc3178aaba1f695455234af40730a03#observablecreateͷྫʹ஋ͷ ൃߦ࣌ؒΛ෇Ճ͢Δ ▸ subscribe()Λߦ͏(Observer͕౉͞ΕΔ)͝ͱʹɺ஋͕ൃߦ ͞ΕΔ ▸ subscribe()ΛߦͬͨࡍʹɺStream͕Ͱ͖Δ ▸ ͭ·Γɺ1ͭͷStream͸෼ذ͠ͳ͍

Slide 32

Slide 32 text

Deep dive to Rx Hot, Cold Observable - ஋ͷൃߦ, Streamͷ෼ذ PublishSubjectͷྫʹɺ஋ͷൃߦ࣌ؒΛ෇Ճ͢Δ https://gist.github.com/dameleon/9fc3178aaba1f695455234af40730a03#publishsubjectͷྫʹ஋ͷൃ ߦ࣌ؒΛ෇Ճ͢Δ ▸ subscribe()Λߦ͏(Observer͕౉͞ΕΔ)͔Ͳ͏͔ʹݶΒͣɺ ஋͕ൃߦ͞ΕΔ ▸ subscribe()ΛߦΘͳ͘ͱ΋ɺStream͕Ͱ͖Δ ▸ ͭ·Γɺ1ͭͷStream͕෼ذ͢Δ

Slide 33

Slide 33 text

Deep dive to Rx Hot, Cold Observable - ্ྲྀʹର͢ΔӨڹ Cold ObservableΛHot Observableʹม׵͢Δ https://gist.github.com/dameleon/9fc3178aaba1f695455234af40730a03#cold-observableΛhot- observableʹม׵͢Δ ▸ Cold Observableʹରͯ͠publish()Λcall͢ΔͱɺHot Observableͷੑ࣭Λඋ͑ͨ ConnectableObservableͷΠϯελϯε͕ฦΔ ▸ ConnectableObservableͷΠϯελϯεͷconnect()Λcall͢Δͱ ▸ ্ྲྀͷCold Observableʹ஋Λཁٻ͠ɺ஋͕ൃߦ͞ΕΔ ▸ ൃߦ͞Εͨ஋͸ɺͦͷ࣌఺ͰͷSubscriberʹ௨஌͞ΕΔ ▸ લड़ͷαϯϓϧͰ͸ɺ”C"ͷSubscriberʹ͸஋͕ྲྀΕͳ͍ ▸ Cold to HotΛߦ͏Operator͸͍͔ͭ͋͘Δ(shareReplay(n)౳)

Slide 34

Slide 34 text

Deep dive to Rx Hot, Cold Observable - ্ྲྀʹର͢ΔӨڹ Hot ObservableΛCold Observableʹม׵͢Δ https://gist.github.com/dameleon/9fc3178aaba1f695455234af40730a03#hot-observableΛcold- observableʹม׵͢Δ ▸ Hot Observableʹରͯ͠ɺಛఆͷOperator(ྫͷ৔߹͸map())Λcall͢ΔͱɺCold Observableͳ Observable͕ฦΔ ▸ Cold to Hotม׵, Subject౳Ҏ֎ͷOperator͸ɺ΄΅શͯCold ObservableʹͳΔ ▸ Cold ObservableΛsubscribe()͢ΔͱɺͦͷCold Observable͕ج఺ͱͳΓStream͸෼ذ͠ͳ͘ͳΔ(= Subscriber͝ͱʹStream͕Ͱ͖Δ) ▸ ྫͰ͸ɺ"A", "B", “C"ͷonNextͰɺmap()Ͱ෇Ճ͞Εͨ࣌ࠁ͕શͯҟͳ͍ͬͯΔ఺ʹ஫໨ ▸ ͭ·ΓSubscriberͷ਺͚ͩɺ`map()`͸ॲཧ͞ΕΔ͜ͱʹͳΔ ▸ ͦͷCold ObservableΛsubscribe()ͨ͠ͱ͖ɺطʹ্ྲྀͷHot Observableͷ஋͕ൃߦ͞Ε͍ͯͨ৔߹ɺͦͷ ஋Λ؍ଌ͢Δ͜ͱ͸Ͱ͖ͳ͍(αϯϓϧ಺, "C"ͷSubscriber͸ɺ"hoge", "fuga"Λ؍ଌͰ͖ͳ͍)

Slide 35

Slide 35 text

Deep dive to Rx Hot, Cold Observable - ·ͱΊ Cold Observable Hot Observable ஋ͷൃߦ subscribe()࣌ ਵ࣌ Streamͷ෼ذ ͠ͳ͍ ͢Δ ্ྲྀʹର͢ΔӨڹ ͳ͠ ্ྲྀͷCold Observableͷ஋ Λཁٻ͢Δ ObservableΛsubscribe()͢Δ৔߹ʹ͸ɺͦͷੑ࣭ΛΑ͘ݟ ۃΊΔඞཁ͕͋Δ

Slide 36

Slide 36 text

Deep dive to Rx Hot, Cold Observable - ิ଍ .shareReplay(bufferSize: Int) ObservableΛѻ͏৔߹ʹɺRxSwiftͷίʔυͷதͰසग़͢Δ Operator http://reactivex.io/documentation/operators/images/replay.c.png 2ͭͷSubscriberͦΕͧΕʹɺಉ͡஋ ͕ྲྀΕ͍ͯΔ఺ʹ஫໨

Slide 37

Slide 37 text

Deep dive to Rx Hot, Cold Observable - ิ଍ - shareReplay ྫ͑͹ɺViewModelͷΑ͏ͳclass͔ΒViewControllerͳͲͷ֎෦ʹରͯ͠ ObservableΛఏڙ͢Δ৔߹ʹɺViewModelࣗ਎ʹ͸ͷ ObservableͷSubscriber਺΍subscribe()ͷλΠϛϯάΛ੍ޚ͢Δ͜ͱ͸ ೉͍͠ ͦ͏͍ͬͨ৔߹ʹɺCold, Hot Observable͍ͣΕͷ৔߹΋ `observable.shareReplay(1)`ͱ͔ͯ͠Βఏڙ͢Δ͜ͱͰ ▸ Cold Observable: ௚લͷHot Observable, ΋͘͠͸ൃੜݩ·Ͱͷ Operatorͷॲཧ͕Subscriber͝ͱʹൃੜ͢ΔͷΛ๷ࢭ͢Δ ▸ Hot Observable: Subscriber͸௚ۙͷ஋Λඞͣߪಡ͢Δ͜ͱ͕Ͱ͖Δ

Slide 38

Slide 38 text

Deep dive to Rx Hot, Cold Observable - ิ଍ - shareReplay https://github.com/ReactiveX/RxSwift/blob/4952adb27c684b47792923b00015516849061eab/ RxExample/RxExample/Examples/GitHubSignup/UsingVanillaObservables/ GithubSignupViewModel1.swift GithubSignupViewModel1 class͕֎෦ʹఏڙ͢ΔObservableͷ΄ͱΜͲ͕.shareReplay(1)͞Ε͍ͯΔ

Slide 39

Slide 39 text

Deep dive to Rx Disposable - ͱ͸ subscribe(), bindTo()ͳͲͷϝιουͷ໭Γ஋ .dispose()ͱ͍͏ϝιουΛ༻͍ͯɺ ▸ ߪಡഁغͷཁٻ ▸ ߪಡͷ࣮૷͕ॴଐ͢ΔίϯςΩετͷϥΠϑαΠΫϧ ౳ͷλΠϛϯάͰɺߪಡΛഁغ͢Δ ߪಡͷഁغΛଵͬͨ৔߹ɺBAD ACCESS΍ϝϞϦϦʔΫ͕ൃੜ͢ ΔՄೳੑ͕͋Δ

Slide 40

Slide 40 text

Deep dive to Rx Disposable - DisposeBag > Dispose bags are used to return ARC like behavior to RX ARCͷڍಈʹԊͬͯɺDisposable܈Λѻ͏Ϋϥε https://github.com/ReactiveX/RxSwift/blob/master/Documentation/GettingStarted.md#dispose-bags `DisposeBag`ͷΠϯελϯεʹ͸`Disposable`Λొ࿥͢Δ͜ͱ͕Ͱ͖ɺͦͷΠϯελϯε͕`deinit`͞Ε ͨ࣌ʹɺ๊͑ͨ`Disposable`܈Λશͯ`dispose()`͢Δ

Slide 41

Slide 41 text

Deep dive to Rx Disposable - DisposeBag https://gist.github.com/dameleon/9fc3178aaba1f695455234af40730a03#disposebag ্هͷྫͰ͸ɺDisposeBag͸ViewControllerͷϥΠϑαΠΫϧͱڞʹ deinit͞ΕɺDisposable܈͸શͯdispose()͞ΕΔ

Slide 42

Slide 42 text

Deep dive to Rx Scheduler - ͱ͸ OperatorͷॲཧΛεέδϡʔϦϯά͢Δ࢓૊Έ ͜ΕΛར༻ͯ͠ɺ࣮ߦεϨου΍࣮ߦॱংͷมߋΛߦ͏͜ͱ͕Ͱ͖Δ http://reactivex.io/documentation/operators/images/schedulers.png

Slide 43

Slide 43 text

Deep dive to Rx Scheduler - Serial vs Concurrent Scheduler ▸ Serial Schedulers: ॱ࣍ॲཧ ▸ Concurrent Schedulers: ฒྻॲཧ

Slide 44

Slide 44 text

Deep dive to Rx Scheduler - Serial Scheduler https://gist.github.com/dameleon/9fc3178aaba1f695455234af40730a03#serial-scheduler ▸ SerialDispatchQueueSchedulerΛ༻͍ͯɺ DispatchQueue.global()Ͱॱ࣮࣍ߦ͞ΕΔSerial SchedulerΛੜ੒ ▸ subscribe()ͷ࣮ߦ͕ɺએݴॱʹߦΘΕ͍ͯΔ

Slide 45

Slide 45 text

Deep dive to Rx Scheduler - Serial Scheduler https://gist.github.com/dameleon/9fc3178aaba1f695455234af40730a03#concurrent-scheduler ▸ ConcurrentDispatchQueueSchedulerΛ༻͍ͯɺ DispatchQueue.global()Ͱฒྻ࣮ߦ͞ΕΔSerial SchedulerΛੜ੒ ▸ subscribe()ͷ࣮ߦ͕ɺผʑͷεϨουͰฒྻʹߦΘΕ͍ͯΔ

Slide 46

Slide 46 text

Deep dive to Rx Scheduler - Builtin ▸ Serial Scheduler ▸ CurrentThreadScheduler ▸ MainScheduler ▸ SerialDispatchQueueScheduler ▸ ConcurrentScheduler ▸ ConcurrentDispatchQueueScheduler ▸ OperationQueueScheduler ͍͔ͭ͘ͷScheduler͕༻ҙ͞Ε͍ͯΔ ࣗ෼ࣗ਎ͰSchedulerΛ࣮૷͢Δ͜ͱ΋Մೳ https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md#builtin-schedulers

Slide 47

Slide 47 text

Deep dive to Rx Scheduler - SchedulerΛ੾Γସ͑Δ ▸ observeOn, subscribeOnͱ͍͏OperatorͰSchedulerΛ੾ Γସ͑Δ͜ͱ͕Ͱ͖Δ https://gist.github.com/dameleon/9fc3178aaba1f695455234af40730a03#schedulerΛ੾Γସ͑Δ

Slide 48

Slide 48 text

Deep dive to Rx Scheduler - SchedulerΛ੾Γସ͑Δ - observeOn ▸ ࢦఆͨ͠Ҏ߱ʹ࣮ߦ͞ΕΔOperatorͷSchedulerΛ੾Γସ͑ Δ http://reactivex.io/documentation/operators/images/observeOn.c.png

Slide 49

Slide 49 text

Deep dive to Rx Scheduler - SchedulerΛ੾Γସ͑Δ - subscribeOn ▸ Ұ൪্ྲྀͷObservableىಈ͢ΔSchedulerΛ੾Γସ͑Δ ▸ ಺෦తʹ͸ࢦఆͨ͠Schedulerʹରͯ͠ObservableΛsubscribe()͢ΔλεΫΛ௥Ճ͠ ͍ͯΔ ▸ Cold ObservableΛىಈ͢ΔSchedulerͷࢦఆ͸Ͱ͖Δ͕ɺHot Observable͸onNext(element: Element)ΛͦͷcontextͷSchedulerͰ࣮ߦ͢ΔͨΊɺࢦఆͯ͠΋ҙຯ͕ͳ͍ http://reactivex.io/documentation/operators/images/subscribeOn.c.png

Slide 50

Slide 50 text

Deep dive to Rx Operator http://reactivex.io/documentation/operators.html Λݩʹɺ୅දతͳ΋ͷΛه͢ ※ࢀরઌ͸C#࣮૷ͰͷαϯϓϧͳͷͰRxSwiftͰͷOperator໊͕ҟͳΔ৔߹͕͋Δ

Slide 51

Slide 51 text

Deep dive to Rx Operator - ੜ੒ܥ ObservableͷFactory http://reactivex.io/documentation/operators.html#creating

Slide 52

Slide 52 text

Deep dive to Rx Operator - ੜ੒ܥ - Observable.create Observable.create(subscribe: (AnyObserver) -> Disposable) -> Observable αϯϓϧͰ΋͓ͳ͡ΈɺϒϩοΫ಺ͰAnyObserverʹରͯ͠஋Λൃߦ͍ͯ͘͠ObservableͷFactory http://reactivex.io/documentation/operators/images/create.c.png

Slide 53

Slide 53 text

Deep dive to Rx Operator - ੜ੒ܥ - Observable.from Observable.from(array: [E]) ഑ྻ͔ΒObservableΛੜ੒͢ΔFactory http://reactivex.io/documentation/operators/images/from.c.png

Slide 54

Slide 54 text

Deep dive to Rx Operator - ੜ੒ܥ - Observable.interval Observable.interval(period: RxTimeInterval, scheduler: SchedulerType) ࢦఆͨ͠RxTimeInterval(TimeInterval)͝ͱʹɺ0͔Βincrementͨ͠஋Λൃߦ͍ͯ͘͠Observableͷ Factory http://reactivex.io/documentation/operators/images/interval.c.png

Slide 55

Slide 55 text

Deep dive to Rx Operator - ม׵ܥ ObservableΛม׵͢ΔOperator http://reactivex.io/documentation/operators.html#transforming

Slide 56

Slide 56 text

Deep dive to Rx Operator - ม׵ܥ - .map .map(transform: E throws -> R) -> Observable ElementΛR΁ม׵͢ΔOperator http://reactivex.io/documentation/operators/map.html

Slide 57

Slide 57 text

Deep dive to Rx Operator - ม׵ܥ - .flatMap .flatMap(selector: E throws -> O) -> Observable ElementΛड͚औΓɺ৽͍͠ObservableΛޙଓʹྲྀ͢Operator http://reactivex.io/documentation/operators/images/flatMap.c.png

Slide 58

Slide 58 text

Deep dive to Rx Operator - ม׵ܥ - .buffer .buffer(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType) -> Observable<[E]> ࢦఆͨ͠timeSpan, countͷͲͪΒ͔ͷ࠷େ஋͝ͱʹόοϑΝϦϯάͨ͠஋Λ[Element]ͱͯ͠ޙଓʹྲྀ͢ Operator http://reactivex.io/documentation/operators/images/Buffer.png

Slide 59

Slide 59 text

Deep dive to Rx Operator - ϑΟϧλϦϯάܥ StreamʹྲྀΕΔElementΛϑΟϧλϦϯά͢ΔOperator http://reactivex.io/documentation/operators.html#filtering

Slide 60

Slide 60 text

Deep dive to Rx Operator - ϑΟϧλϦϯάܥ - .filter .filter(predicate: E throws -> Bool) -> Observable ElementΛR΁ม׵͢ΔOperator http://reactivex.io/documentation/operators/filter.html

Slide 61

Slide 61 text

Deep dive to Rx Operator - ϑΟϧλϦϯάܥ - .throttle .throttle(dueTime: RxTimeInterval, scheduler: SchedulerType) -> Observable ࢦఆͨ͠scheduler্ͰɺdueTimeؒͷElementΛؒҾ͘Operator http://reactivex.io/documentation/operators/debounce.html

Slide 62

Slide 62 text

Deep dive to Rx Operator - ϑΟϧλϦϯάܥ - .distinctUntilChanged .distinctUntilChanged() -> Observable ࠷ޙʹྲྀͨ͠ElementͱݱࡏͷElementͱΛൺֱ͠ɺࠩҟ͕͋Δ৔߹ͷΈޙଓʹྲྀͨ͢ΊͷOperator http://reactivex.io/documentation/operators/distinct.html ※URLઌͷαϯϓϧͰɺ্෦ͷετϦʔϜʹᶃ͕ଟ͘ग़Δόά͕͋Δ

Slide 63

Slide 63 text

Deep dive to Rx Operator - ߹੒ܥ ҟͳΔObservableಉ࢜Λ߹੒͢ΔOperator http://reactivex.io/documentation/operators.html#combining

Slide 64

Slide 64 text

Deep dive to Rx Operator - ߹੒ܥ - Observable.of().merge Observable.of(ObservableConvertibleType…).merge() ෳ਺ͷObservableΛϚʔδ͢Δ http://reactivex.io/documentation/operators/images/merge.png

Slide 65

Slide 65 text

Deep dive to Rx Operator - ߹੒ܥ - Observable.zip Observable.zip(source1: O1, source2: O2, resultSelector: (O1.E, O2.E) throws -> E) -> Observable ࢦఆͨ͠ෳ਺ͷObservableʹྲྀΕΔॱ൪͕Ұகͨ͠Elementಉ࢜ʹରͯ͠ԋࢉΛߦ͍ɺ৽͠ ͍ElementΛޙଓʹྲྀ͢Operator http://reactivex.io/documentation/operators/zip.html

Slide 66

Slide 66 text

Deep dive to Rx Operator - ߹੒ܥ - Observable.combineLatest Observable.combineLatest(source1: O1, source2: O2, resultSelector: (O1.E, O2.E) throws -> E) -> Observable ࢦఆͨ͠ෳ਺ͷObservableʹͯɺଞํͷ௚લͷElementͱݱࡏͷElementʹରͯ͠ԋࢉΛߦ ͍ɺ৽͍͠ElementΛޙଓʹྲྀ͢Operator http://reactivex.io/documentation/operators/combinelatest.html

Slide 67

Slide 67 text

Deep dive to Rx Operator - ΤϥʔϋϯυϦϯάܥ onError(error: Error)͔Βൃੜ͢ΔErrorΛѻ͏Operator http://reactivex.io/documentation/operators.html#error

Slide 68

Slide 68 text

Deep dive to Rx Operator - ΤϥʔϋϯυϦϯάܥ - .catchError .catchError(handler: (Error) throws -> Observable) blockͰErrorΛड͚औΓɺcatchՄೳͳErrorͰ͋Ε͹ޙଓͷͨΊͷObservableΛฦ͢ Operator catchෆՄೳͳ৔߹͸ɺblock಺Ͱrethrow͢ΔͱɺޙଓʹΤϥʔ͕ྲྀΕΔ http://reactivex.io/documentation/operators/images/Catch.png

Slide 69

Slide 69 text

Deep dive to Rx Operator - ΤϥʔϋϯυϦϯάܥ - .catchErrorJustReturn .catchErrorJustReturn(E) -> Observable Error͕ྲྀΕ͖ͯͨࡍʹɺࢦఆͨ͠஋Λޙଓ΁ྲྀ͢Operator ਤͳ͠

Slide 70

Slide 70 text

Deep dive to Rx Operator - ΤϥʔϋϯυϦϯάܥ - .catchError .retry(maxAttemptCount: Int) Error͕ྲྀΕ͖ͯͨࡍʹɺ௚લ·ͰͷObservableͰͷॲཧΛࢦఆճ਺͚ͩϦτϥΠ(࠶౓ subscribe())͢ΔOperator ࢦఆճ਺Λ௒͑ͨ৔߹ɺޙଓʹError͕ྲྀΕΔ http://reactivex.io/documentation/operators/images/retry.C.png

Slide 71

Slide 71 text

Deep dive to Rx Operator - ϢʔςΟϦςΟܥ http://reactivex.io/documentation/operators.html#utility

Slide 72

Slide 72 text

Deep dive to Rx Operator - ϢʔςΟϦςΟܥ - .do .do(onNext: ((E) throws -> Void)?, onError: ((Error) throws -> Void)?, onCompleted: (() throws -> Void)?, onSubscribe: (() -> ())?, onDispose: (() -> ())?) -> Observable onNext, onErrorͳͲͷ֤λΠϛϯάͰݺ͹ΕΔblockΛొ࿥͢ΔOperator ޙଓʹSubscriber͕1ͭ΋ͳ͍৔߹ɺ֤block͸ݺ͹Εͳ͍ http://reactivex.io/documentation/operators/images/do.c.png

Slide 73

Slide 73 text

Deep dive to Rx Operator - ϢʔςΟϦςΟܥ - .delay .delay(dueTime: RxTimeInterval, scheduler: SchedulerType) ࢦఆͨ͠Πϯλʔόϧ࣌ؒ෼ɺElement͕ྲྀΕΔͷΛ஗Ԇͤ͞Δ http://reactivex.io/documentation/operators/delay.html

Slide 74

Slide 74 text

Deep dive to Rx Operator - ϢʔςΟϦςΟܥ - .using .using(resourceFactory: () throws -> ResourceType, observableFactory: (ResourceType) throws -> Observable) DisposableͳϦιʔε(ResourceType)ͱɺͦͷResourceTypeʹର͢ΔObservableͷϑΝΫτ ϦΛ౉͢ͱɺsubscribe()ͷϥΠϑαΠΫϧͰϦιʔεͷੜ੒͔Βഁغ·Ͱߦ͏͜ͱ͕Ͱ͖ΔOperator http://reactivex.io/documentation/operators/images/using.c.png

Slide 75

Slide 75 text

࣮૷ܥͷ ঺հ

Slide 76

Slide 76 text

࣮૷ܥͷ঺հ ReactiveXܥ http://reactivex.io/languages.html SwiftͰ͸RxSwiftͰ͋Γɺߏ੒͸ҎԼͷΑ͏ʹͳ͍ͬͯΔ ▸ RxSwift: ίΞ࣮૷ ▸ RxCocoa: UIKit޲͚ʹRxΛద༻͢Δextension ▸ RxTest, RxBlocking: ςετίʔυ޲͚ͷRx࣮૷, ֦ு

Slide 77

Slide 77 text

࣮૷ܥͷ঺հ SwiftͰͷଞ࣮૷ܥ ▸ ReactiveCocoa ▸ ReactiveSwift: ίΞ࣮૷ ▸ ReactiveCocoa: UIKit޲͚ͷextension ▸ RxSwiftͱ͸Ϋϥε΍ϝιουͷ໊শʹେ͖ࠩ͘ҟ͕͋Δ ▸ Observable -> Signal, subscribe -> observe ▸ subscribeΛߦ͏ͨΊͷObserverͱ͍͏Ϋϥε ▸ Hot, Cold ObservableΛͦΕͧΕɺSignal, SignalProducerͱ͍͏ܕ Ͱѻ͑ΔΑ͏ʹ͍ͯ͠Δ

Slide 78

Slide 78 text

࣮૷ܥͷ঺հ SwiftͰͷଞ࣮૷ܥ ▸ ReactiveKit ▸ ReactiveKit: ίΞ࣮૷ ▸ Bond: UIKit޲͚ͷextension ▸ ݩʑ͸Swift Bondͱ͍͏ϑϨʔϜϫʔΫ͕ͩͬͨɺίΞ࣮ ૷ͱUI Bindingͷextension͕෼཭͠ࠓͷߏ੒ʹͳͬͨ ▸ ࣮૷ܗଶ͸ReactiveSwiftʹ͍͕ۙɺScheduler͕ͳ͍(࣮ߦ ͢ΔDispatchQueue͸ࢦఆͰ͖Δ)ͳͲྑ͘΋ѱ͘΋࠷খݶ

Slide 79

Slide 79 text

࣮૷ܥͷ঺հ Ͳͷ࣮૷ܥΛબͿ͔ʁ ▸ SwiftͰݴ͑͹֤࣮૷ͱ΋ੵۃతʹcommit͞Ε͍ͯΔ ▸ Ұ൪࢖ΘΕ͍ͯΔ&ଟݴޠؒͰͷίϯςΩετεΠον͕গ ͳ͍&υΩϡϝϯτ͕ଟ͍ͷ͸ RxSwift ▸ ͨͩ͠ɺͦͷ෼ϑϨʔϜϫʔΫ͕େ͖͍ͷ΋ RxSwift ▸ ΞϓϦͷੑ࣭ʹΑͬͯ΋બ୒ࢶͱͳΔཁૉ͕มΘΔͷͰɺҰ ֓ʹ͸ݴ͑ͳ͍

Slide 80

Slide 80 text

·ͱΊ

Slide 81

Slide 81 text

·ͱΊ ▸ RxΛ࢖͏ͱɺ࣌ܥྻͷΠϕϯτ͕࿈ଓͰൃੜ͢ΔΑ͏ͳσʔλू߹Λએݴత ʹѻ͑Δ ▸ ֶशίετ͸ͦΕͳΓʹߴ͍ ▸ Observableͷಛੑ ▸ ߪಡͷഁغͱϥΠϑαΠΫϧ ▸ Operator΁ͷཧղͱ૊Έ߹Θͤ ▸ Schedulerͷ੾Γସ͑ ▸ શͯRxͰ૊ΈཱͯΔඞཁ͸ͳ͍ͷͰɺUI΍HTTP RequestͳͲ͔Β·ͣ͸࢖ ͍࢝ΊͯΈΔͷ͕Φεεϝ ▸ ࠓࢿྉͰ঺հͨ͠Ҏ֎ʹɺRxSwiftʹ͸DriverͳͲͷػೳ΋͋Δ

Slide 82

Slide 82 text

·ͱΊ ͳΔ΄Ͳʁ

Slide 83

Slide 83 text

ࢀߟ ▸ Rx (Reactive Extensions) - Home ▸ ReactiveX ▸ ࢿྉ಺ͷMarble Diagrams͸ɺReactiveXͷίϯςϯπͰ ͋ΓɺCreative Commons Attribution 3.0ͷϥΠηϯεʹ ΑΓอޢ͞Ε͍ͯ·͢ ▸ Reactive Extensionsͷ͸͡Ί͔ͨ - ͔͖ͣͷBlog@hatena