Slide 1

Slide 1 text

͍·͞Βฉ͚ͳ͍ RxSwiftೖ໳ גࣜձࣾ tech vein ழມ ॆԝ

Slide 2

Slide 2 text

ࣗݾ঺հ גࣜձࣾ tech vein ୅ද ழມ ॆԝ (͍ͷ·ͨ ΈͭͻΖ) ձࣾHP: https://www.tech-vein.com/ private twitter: @ino2222

Slide 3

Slide 3 text

ެ։தͷAndroid/iOSΞϓϦ ι΢ϧΞϯϦʔγϡ ࣗ෼ͷΦϦΩϟϥΛ࡞ΔεϚϗ31( IUUQTPVOUFDIWFJODPN IUUQTCJUMZ);BV3 $IJJ2 ஍ҬͰॿ͚߹͑Δಗ໊૬ஊΞϓϦ IUUQTBQQMFDP,[IYD ϙέοτΞϒετϥΫτ ҩྍैࣄऀ޲͚ͷ࠷৽δϟʔφϧӾཡΞϓϦ

Slide 4

Slide 4 text

ࠓ೔͓࿩͢Δ͜ͱ • RxSwiftͱ͸ • RxSwiftͷجຊ • ͜Ε͚֮ͩ͑ͨΒ࢖͑ΔΑ͏ʹͳΔ͔΋ʁ

Slide 5

Slide 5 text

ࠓ೔͓࿩͠ͳ͍͜ͱ(஌ͬͯΔਓ޲͚) • Cold -> Hot ม׵ • Reactive Streams(backPressure ͳͲ)

Slide 6

Slide 6 text

RxSwiftͱ͸ • ֤ݴޠͰ࣮૷͞Ε͍ͯΔʮRx(Reactive Extension)ʯ
 ͷSwift޲͚ϥΠϒϥϦ • Reactive Extension … ΋ͱ΋ͱ͸
 C#.NET Ͱ࢖ΘΕͩͨ͠ Rx.NET ͕ΦϦδφϧ • Java(RxJava), JavaScript(RxJS), C++(RxCpp), Ruby(Rx.rb), PHP(RxPHP) ͳͲͳͲଟ਺

Slide 7

Slide 7 text

ReactiveXͱ͸Կ͔ʁ ReactiveX = Reactive Extension Reactive Programming ʹ൓ԠతϓϩάϥϛϯάΛ͢Δͨ Ίͷ Extension = ֦ு ReactiveX͸ - σβΠϯύλʔϯͷ Observable ύλʔϯ - σβΠϯύλʔϯͷ Iterator ύλʔϯ - ؔ਺ܕϓϩάϥϛϯά Λ૊Έ߹Θͤͯ࡞ΒΕͨϥΠϒϥϦͷ͜ͱ

Slide 8

Slide 8 text

Observerύλʔϯ σʔλΛ؂ࢹ͢Δਓͱ఻͑Δ࢓૊ΈΛ ந৅Խͨ͠σβΠϯύλʔϯ ͕͜͜େࣄʂ

Slide 9

Slide 9 text

Iterator ύλʔϯ https://ja.wikipedia.org/wiki/Iterator_ύλʔϯ Ұ࿈ͷσʔλΛॱ൪ʹॲཧ͢ΔσβΠϯύλʔϯ ͕͜͜େࣄʂ

Slide 10

Slide 10 text

ؔ਺ܕϓϩάϥϛϯά ˠ ͦΕͧΕͷؔ਺͸ */065ʹ͔͠ Өڹ͠ͳ͍ ʹ෭࡞༻͕ͳ͍

Slide 11

Slide 11 text

ͦͯ͠Rx΁…

Slide 12

Slide 12 text

͕͜͜خ͍͠RxSwift ࣌ܥྻσʔλΛؚΉɺ͋ΒΏΔσʔλΛετϦʔϜͱͯ͠εϚʔτʹॲཧͰ͖Δɻ ετϦʔϜͱͯ͠ॱ൪ʹॲཧͰ͖Δ͜ͱͰɺ΍΍͍͜͠ඇಉظ੍ޚ͕γϯϓϧʹͳΔɻ →ίʔϧόοΫ஍ࠈ͔Βͷղ์ ந৅ԽʹΑΓૹΓखɾड͚औΓखΛ௚઀஌Βͳ͍··ॲཧ͕ग़དྷΔͷͰૄ݁߹ʹͳΔɻ →վมͷӨڹൣғ͕খ͘͞ͳΔ →෦඼Խɾڞ௨Խ͕ਐΉ ֤छετϦʔϜΛѻ͏ศརͳಓ۩͕ἧ͍ͬͯΔɻ →ετϦʔϜͷੜ੒ɾม׵ɾ߹੒Λߦ͏ΦϖϨʔλ܈ →ετϦʔϜͷεϨου੾Γସ͑ػೳ

Slide 13

Slide 13 text

RxSwiftͷجຊ

Slide 14

Slide 14 text

RxSwiftͷجຊ ͜Ε͚ͩ஌ͬͯͨΒ RxŧŔŕŪɹɹ ũƄŝſͬͯݴ͑Δ

Slide 15

Slide 15 text

RxSwiftͷجຊ ͜Ε͚ͩ஌ͬͯͨΒ RxŧŔŕŪ(ŦƄş)ũƄŝſͬͯݴ͑Δ͔΋ʁ

Slide 16

Slide 16 text

Observable, Subject, Disposable ΩϞʹͳΔͷ͸ɺ ͜ͷ̏ܥ౷ͷΫϥε(ϓϩτίϧ)ɻ Ϋϥε͸৭ʑ͋Γ·͕͢ɺ ͍͍ͩͨ͜ΕΒͷ஥ؒͰ͢ɻ

Slide 17

Slide 17 text

+ subscribe() Observable + onNext() + onError() + onCompleted() + subscribe() Subject ܧঝ + dispose() Disposable subscribe() ͷ໭Γ஋ Observable, Subject, Disposable

Slide 18

Slide 18 text

Observable ௚༁͢Δͱɺ؂ࢹ͢Δ͜ͱ͕Ͱ͖Δର৅ɻ ೚ҙͷܕ T ʹ͍ͭͯɺ؂ࢹͯ͠σʔλʢΠϕϯτ)Λड͚औ Δࣄ͕Ͱ͖ΔΫϥεɾΠϯελϯεͰ͢ɻ ࣌ܥྻͰσʔλ͕ObservableʹྲྀΕΔ͜ͱ͔Βɺ Observable͸ετϦʔϜ(Stream)ͱ΋ݺͼ·͢ɻ + subscribe() Observable + onNext() + onError() + onCompleted() + subscribe() Subject ܧঝ + dispose() Disposable subscribe() ͷ໭Γ஋

Slide 19

Slide 19 text

“Hello” “Rx” “World” Observable completed ࣌ؒͷྲྀΕ ࣮ߦ݁ՌɿԼͷॱʹग़ྗ͞ΕΔɻ OFYU )FMMP OFYU 3Y OFYU 8PSME DPNQMFUFE

Slide 20

Slide 20 text

Subject ؆୯ʹݴ͏ͱɺ೚ҙͷσʔλΛྲྀ͢ػೳ(Observer ͱͯ͠ͷػೳ)Λ࣋ͬͨObservable࣮૷ɻ RxSwift ͷSubject͸ PublishSubject, BehaviorSubject, ReplaySubject ͷ̏छྨɻ + subscribe() Observable + onNext() + onError() + onCompleted() + subscribe() Subject ܧঝ + dispose() Disposable subscribe() ͷ໭Γ஋

Slide 21

Slide 21 text

Subject͸ObserverΛܧঝ͍ͯ͠ΔͷͰ Observableͱͯ͠ѻ͑Δɻ Subject͸onNext(), onComplete(), onError() ͳͲͷσʔλɾΠϕϯτൃ৴ϝιουΛ࣋ͭɻ

Slide 22

Slide 22 text

ετϦʔϜͷΠϕϯτ • next
 σʔλ͕ਖ਼͘͠ྲྀΕ͖ͯͨͱ͍͏Πϕϯτɻ೚ҙͷܕͷσʔλΛҾ਺ʹ࣋ ͭɻ • error
 ετϦʔϜத͕Τϥʔ(ྫ֎)Ͱҟৗఀࢭͨ࣌͠ʹྲྀΕΔΠϕϯτɻൃੜͨ͠ ΤϥʔΛҾ਺ʹ࣋ͭɻ • completed
 ετϦʔϜ͕ਖ਼͘͠׬ྃͨ࣌͠ʹൃੜ͢ΔΠϕϯτɻετϦʔϜͷ࠷ޙʹ Ұ౓͚ͩൃੜ͢Δɻ
 ʢೖྗΛ଴ͪଓ͚͍ͨͱ͖͸completedΛྲྀ͞ͳ͍ʣ

Slide 23

Slide 23 text

ετϦʔϜͷΠϕϯτ next completed next next next next next completed next next ετϦʔϜ͸ next ͰσʔλΛྲྀ͠ɺDPNQMFUFEͰऴྃ͢Δ DPNQMFUFE͕དྷͨΒɺͦͷઌ͸OFYUFSSPS͸ྲྀͤͳ͍ next next next FSSPS ྫ֎ ͕དྷͨΒɺͦͷઌ͸OFYUDPNQMFUFEFSSPS͸ྲྀͤͳ͍ error

Slide 24

Slide 24 text

RxSwift ͷ Subject࢖͍෼͚ ɾPublishSubject ɹաڈͷσʔλΛอ࣋͠ͳ͍Subjectɻ ɹར༻ྫɿϘλϯͷλοϓΠϕϯτ ɾBehaviorSubject ɹաڈͷσʔλͷ͏ͪ௚ۙͷ̍ͭΛอ͍࣋ͯ͠ΔSubjectɻ ɹར༻ྫɿεΠονON/OFFঢ়ଶɾϢʔβεςʔλεͳͲ ɾReplaySubject.create(bufferSize: Int) ɹաڈͷ௚ۙσʔλΛࢦఆόοϑΝʹೖΔ͚ͩอ͍࣋ͯ͠ΔSubjectɻ ɹόοϑΝαΠζ̌ͳΒPublishSubjectͱಉ͡ɻ ɹόοϑΝαΠζ̍ͳΒBehaviorSubjectͱಉ͡ɻ ɹར༻ྫɿࢥ͍͔ͭͳ͍…ཤྺܥͰ࢖͑Δ͔΋ʁ

Slide 25

Slide 25 text

PublishSubject PublishSubject completed ࣌ؒͷྲྀΕ TVCTDSJCF TVCTDSJCF

Slide 26

Slide 26 text

BehaviorSubject BehaviorSubject completed ࣌ؒͷྲྀΕ TVCTDSJCF TVCTDSJCF TVCTDSJCF

Slide 27

Slide 27 text

ReplaySubject ReplaySubject.create(bufferSize: 2) completed ࣌ؒͷྲྀΕ TVCTDSJCF TVCTDSJCF TVCTDSJCF

Slide 28

Slide 28 text

Disposable ௚༁͢Δͱɺഇغɾॲ෼Ͱ͖Δ΋ͷɻ ObservableΛ subscribe(ߪಡ) ͢Δͱ໭Γ஋ͱͯ͠ Disposable Λ ฦ͠·͢ɻ Disposableʹରͯ͠dispose()ΛݺͿ͜ͱͰɺඇಉظॲཧͷΩϟϯη ϧͳͲɺ؂ࢹ͢Δଆͱͯ͠ॲཧΛࢭΊΔࣄ͕Ͱ͖·͢ɻ ྫɿը໘Λดͨ͡Β௨৴Ωϟϯηϧͨ͠Γɺೖྗ଴ͪΛࢭΊͨΓ͢ Δɻ + subscribe() Observable + onNext() + onError() + onCompleted() + subscribe() Subject ܧঝ + dispose() Disposable subscribe() ͷ໭Γ஋

Slide 29

Slide 29 text

+ subscribe() Observable + onNext() + onError() + onCompleted() + subscribe() Subject ܧঝ + dispose() Disposable subscribe() ͷ໭Γ஋ ॲཧͷྲྀΕ

Slide 30

Slide 30 text

+ subscribe() Observable + onNext() + onError() + onCompleted() + subscribe() Subject ܧঝ + dispose() Disposable subscribe() ͷ໭Γ஋ subscribe(onNext: … ) ॲཧͷྲྀΕ

Slide 31

Slide 31 text

+ subscribe() Observable + onNext() + onError() + onCompleted() + subscribe() Subject ܧঝ + dispose() Disposable subscribe() ͷ໭Γ஋ subscribe(onNext: … ) ΠϕϯτΛҾ਺ͷΫϩʔδϟͰ଴ͪड͚Δ PO/FYU lIFMMPz PO/FYU l3Yz PO/FYU l8PSMEz ʜ PO$PNQMFUFE ॲཧͷྲྀΕ

Slide 32

Slide 32 text

+ subscribe() Observable + onNext() + onError() + onCompleted() + subscribe() Subject ܧঝ + dispose() Disposable subscribe() ͷ໭Γ஋ subscribe(onNext: … ) dispose() ΠϕϯτΛҾ਺ͷΫϩʔδϟͰ଴ͪड͚Δ ॲཧͷྲྀΕ

Slide 33

Slide 33 text

+ subscribe() Observable + onNext() + onError() + onCompleted() + subscribe() Subject ܧঝ + dispose() Disposable subscribe() ͷ໭Γ஋ subscribe(onNext: … ) dispose() ΠϕϯτΛҾ਺ͷΫϩʔδϟͰ଴ͪड͚Δ ॲཧΛࢭΊͨ͘ͳͬͨΒEJTQPTFΛݺͿ ॲཧͷྲྀΕ

Slide 34

Slide 34 text

(x, y) (x2, y2) (x3, y3) ྫɿλονΠϕϯτͷ؂ࢹ Observable) ࣌ؒͷྲྀΕ (x4, y4) TVCTDSJCF EJTQPTF EJTQPTFE (x2, y2) (x3, y3) Disposable.dispose()

Slide 35

Slide 35 text

DisposeBag disposeΛ͍͍ͪͪ͢Δͷ͸ΊΜͲ͍͘͞ɻ ͦΜͳͱ͖͸DisposeBagɻ

Slide 36

Slide 36 text

DisposeBag ը໘ͳͲɺ؂ࢹݩΠϯελϯε͕ࢮΜͩΒࣗಈͰͥΜ Ϳdisposeͯ͠΄͍࣌͠ʹ࢖͑ΔศརΫϥεɻ DisposeBagΠϯελϯεʹಥͬࠐΜͰ͓͘ͱɺ disposeBag͕ղ์͞ΕΔ࣌ʹ·ͱΊͯdisposeBagͷ தͷdisposableΛdisposeͯ͘͠ΕΔɻ ˠ3Yඪ४Ͱ͸ͳ͍Ͱ͕͢ΊͪΌͪ͘Ό࢖͍·͢ɻ ɹͱΓ͋͑ͣ%JTQPTF#BH࡞ͬͯ์ΓࠐΜͰ͓͚͹͍͍ͱࢥ͏ɻ

Slide 37

Slide 37 text

(x, y) (x2, y2) (x3, y3) ྫɿλονΠϕϯτͷ؂ࢹ Observable) ࣌ؒͷྲྀΕ (x4, y4) TVCTDSJCF EJTQPTF EJTQPTFE (x2, y2) (x3, y3) EJTQPTFE CZEJTQPTF#BH Subscibe ॲཧ DisposeBag JOJU EFJOJU View %JTQPTBCMFΛ %JTQPTF#BHͷ தʹೖΕΔɻ %JTQPTF#BH͸ ഁغ͞ΕΔͱ தͷ%JTQPTBCMFΛ EJTQPTF͢Δɻ

Slide 38

Slide 38 text

IUUQTHJUIVCDPNFDPPQOFUSYTXJGUCFHJOOFSCMPCNBTUFS3Y4XJGU4BNQMF3Y4XJGU4BNQMF 6*4BNQMF7JFX$POUSPMMFSTXJGU DisposeBagͷར༻ྫ ˡ6*7JFX$POUSPMMFSͷ ϑΟʔϧυʹEJTQPTF#BHΛஔ͍͓ͯ͘
 ˠը໘͕ดͨ͡Β6*7JFX$POUSPMMFS͕ࢮ͵ɻ ˠ6*7JFX$POUSPMMFS͕ࢮΜͩΒ%JTQPTF#BH΋ࢮ͵ɻ ˠ%JTQPTF#BH͕ࢮΜͩΒඥͮ͘EJTQPTBCMF͕ ɹEJTQPTF ͞ΕΔɻ

Slide 39

Slide 39 text

ΦϖϨʔλ(Operator) Rxʹ͸ Observable, SubjectͰ࡞ͬͨετϦʔϜΛૢ ࡞͢Δػೳ͕ఏڙ͞Ε͍ͯ·͢ɻ ετϦʔϜ(=Observable)Λม׵ɾ߹੒ɾੜ੒͢Δૢ ࡞ͷ͜ͱΛʮΦϖϨʔλʯͱݺͼ·͢ɻ

Slide 40

Slide 40 text

ετϦʔϜΛ࡞Δ ̍ … Subject Ϋϥε͔Β࡞Δ ̎ … from(), of(), just() ͳͲͰ೚ҙͷ഑ྻɾ஋Λ ม׵ͯ͠࡞Δ ̏ … Observable.create() Ͱ೚ҙͷॲཧ͔Β࡞Δ

Slide 41

Slide 41 text

PublishSubject completed ࣌ؒͷྲྀΕ TVCTDSJCF TVCTDSJCF

Slide 42

Slide 42 text

10 Observable.just(10) completed σʔλετϦʔϜͷྲྀΕ just( ) ετϦʔϜม׵

Slide 43

Slide 43 text

“a” Observable.of(“a”, ”b”, ’c”, ”d”, “e”) completed σʔλετϦʔϜͷྲྀΕ of( , , , , ) ετϦʔϜม׵ “b” “c” “d” “e”

Slide 44

Slide 44 text

1 Observable.from([1, 3, 5, 7, 9]) completed σʔλετϦʔϜͷྲྀΕ from([ , , , , ]) ετϦʔϜม׵ 3 5 7 9

Slide 45

Slide 45 text

Observable.error(MyError()) σʔλετϦʔϜͷྲྀΕ error( ) ετϦʔϜม׵ myError

Slide 46

Slide 46 text

1 Observable.create(೚ҙͷॲཧ) completed σʔλετϦʔϜͷྲྀΕ create(೚ҙͷॲཧ) ετϦʔϜม׵ 3 5 7 9

Slide 47

Slide 47 text

map: ετϦʔϜΛม׵͢Δ map(_:((T) -> R)) -> Observable ೚ҙͷܕɾ஋ͷετϦʔϜΛՃ޻ͯ͠ผͷܕɾ஋ͷετϦʔ Ϝʹม׵͠·͢ɻ

Slide 48

Slide 48 text

filter: ετϦʔϜΛϑΟϧλ͢Δ filter(_:((T) -> Bool)) -> Observable ྲྀΕ͖ͯͨετϦʔϜΛҾ਺ͷؔ਺Ͱॱ൪ʹॲཧ͠ɺ ݁Ռ͕true ʹͳΔσʔλ͚ͩͷετϦʔϜʹม׵͠·͢ɻ

Slide 49

Slide 49 text

flatMap: ετϦʔϜΛม׵͢ Δ flatMap(_:((T) -> Observable)) -> Observable ೚ҙͷܕɾ஋ͷετϦʔϜΛՃ޻ͯ͠ผͷܕɾ஋ͷετϦʔ Ϝʹม׵͠·͢ɻmapͱ΄΅ಉ͡Ͱ͕͢ɺΫϩʔδϟͷฦΓ ஋͕Observableʹͳ͍ͬͯΔ఺͕ҟͳΓ·͢ɻ

Slide 50

Slide 50 text

1 completed 2 3 flatMap({x in Observable.of(x, x*10)}) 1 completed 2 3 10 20 30 completed completed completed 1 completed 2 3 10 20 30

Slide 51

Slide 51 text

filter, map, flatMap ͷྫ

Slide 52

Slide 52 text

map ͱ flatMap ͷ࢖͍෼͚ map … ಉظతʹॲཧͰ͖Δσʔλม׵ʹ࢖͍·͢ɻ ྫɿStringܕ -> URLܕɺInt ܕΛॱ൪ʹܭࢉͯ͠ม׵͢Δ flatMap … ඇಉظॲཧͳͲɺผͷετϦʔϜΛ࢖ͬͯม׵͢Δ ࣌ʹ࢖͍·͢ɻ ྫɿtwitterͷπΠʔτIDετϦʔϜΛflatMapͯ͠ɺॱ൪ʹAPI Λୟ͍ͯ಺༰Λऔಘͯ͠λΠϜϥΠϯදࣔ͢Δ

Slide 53

Slide 53 text

map ͱ subscribe ͷ࢖͍෼͚ ʢ؆୯ͳઆ໌ʣ ͲͪΒͰ΋onNext ʹ͍ͭͯॲཧ͕ग़དྷ·͕͢ɺ subscribe()͸ܨ͍ͩετϦʔϜΛಈ͔࢝͠ΊΔͱ͍͏େࣄͳ໾ׂ͕͋Γ·͢ɻ (ετϦʔϜม׵ͷऴ୺) subscribe() ͸ετϦʔϜม׵Ͱͳ͘ετϦʔϜ࣮ߦʹͳΔͨΊɺObservable Ͱͳ͘DisposableΛฦ͠·͢ɻ͜ͷͨΊmapͱҧ͍͏͠ΖʹετϦʔϜΛͭͳ ͛Δ͜ͱ͕Ͱ͖·ͤΜɻ

Slide 54

Slide 54 text

1 completed σʔλετϦʔϜͷྲྀΕ Observable.from([1, 2, 3, 4, 5]) ετϦʔϜม׵ 2 3 4 5 filter({ x in x % 2 == 1}) 1 completed 3 5 map({ x in “v\(x)”) “v1” completed “v3” “v5” TVCTDSJCF “v1” completed “v3” “v5”

Slide 55

Slide 55 text

ଞʹ΋ ศརͳΦϖϨʔλ͕ ͨ͘͞Μ͋Γ·͢ ࢀߟɿ http://reactivex.io/documentation/operators.html http://rxmarbles.com/

Slide 56

Slide 56 text

ศརͳΦϖϨʔλͷҰྫ • zip, merge, combineLatest … 
 ෳ਺ͷετϦʔϜΛฒྻʹಈ͔ͯ̍ͭ͠ͷετϦʔϜʹ·ͱΊΔɻ • catchError …
 Τϥʔ͕ൃੜͨ͠ͱ͖ʹϦΧόϦॲཧΛͯ͠onNext ʹม׵͢Δɻ࠶౓ΤϥʔΛ౤͛Δ(throw)͜ͱͰɺผͷΤ ϥʔʹม׵͢Δ͜ͱ΋Ͱ͖Δ • distinctUntilChanged …
 ॏෳআ֎ɻετϦʔϜதʹมߋ͕͋ͬͨͱ͖͚ͩ௨஌͢Δ • throttle, debounce …
 ࿈ଧ๷ࢭʹ࢖͑ΔϑΟϧλɻσʔλΛड͚औͬͨΒҰఆ࣌ؒؒΛ։͚ͳ͍ͱ͕࣍ൃՐ͠ͳͨ͘͠Γ͢Δ • toArray … 
 ഑ྻʹ·ͱΊΔɻcompleted·Ͱ଴ͬͯ̍ͭͷ഑ྻʹม׵͢Δ • groupBy …
 ετϦʔϜͷσʔλΛ޷͖ͳ৚݅ͰάϧʔϓԽ͢Δ

Slide 57

Slide 57 text

Try Rx!

Slide 58

Slide 58 text

RxSwift/RxCocoa ͷ Πϯετʔϧ ᶃ CocoaPods → Podfile: ᶄ pod install ᶅ .swift ϑΝΠϧͰimport ※Carthage / Swift Package Manager ʹ΋ରԠͯ͠·͢ɻ https://github.com/ReactiveX/RxSwift 3Y$PDPBʹ͍ͭͯ͸ޙड़ ·ͨ͸

Slide 59

Slide 59 text

Hello, Rx world ˠ

Slide 60

Slide 60 text

Hello, Rx world2 ˠ

Slide 61

Slide 61 text

Hello, Rx world3 ˣ

Slide 62

Slide 62 text

RxCocoa ʹ͍ͭͯ RxSwift ͷαϒηοτతͳϥΠϒϥϦͰ͢ɻ RxSwift ͕७ਮͳ Rx ࣮૷ͰɺRxCocoa ͸ iOS/Mac։ൃʹศརͳ෇ଐΫϥεɾ֦ு Λఏڙ͍ͯ͠·͢ɻ RxCocoa Λ࢖͏ʹ͸ RxSwift ͱ͸ผʹϥΠϒϥϦΠϯετʔϧ͕ඞཁʹͳΓ·͢ɻ > pod ‘RxCocoa' Ͱ pod install ͯ͠ɺswiftίʔυ಺Ͱ import RxCocoa Λॻ͍͓ͯ͘ͱ࢖͑·͢ɻ

Slide 63

Slide 63 text

RxCocoa ͕ఏڙ͢Δػೳͷྫ

Slide 64

Slide 64 text

UIKit ఏڙΫϥεͷ rx Խ UIView, URLSession ͳͲUIKit,͕ఏڙ͢ΔΫϥεͷϓϩύςΟɾΠϕϯτ ΛrxԽͯ͠ɺObservableΠϯελϯεͱͷ૬ޓόΠϯυΛՄೳʹ͢Δɻ ྫɿ - ਺ࣈΛςΩετೖྗͨ͠Βϥϕϧʹܭࢉ݁ՌΛදࣔ͢Δɻ - ϘλϯΛԡͨ͠ΒAPI௨৴ͯ͠ɺAPI࣮ߦ݁ՌΛϥϕϧʹදࣔ͢Δɻ - URLSession ͷAPI௨৴݁ՌJSONΛ੔ܗͯ͠ϓϩϑΟʔϧը໘ʹදࣔ

Slide 65

Slide 65 text

஌͓ͬͯ͘ͱྑ͍͔΋ɻ • RxAlamofire ͳͲ୳ͤ͹ઌਓ͕RxԽͯ͘͠ ΕͯΔ΋ͷɺެ։͞ΕͯΔίʔυ͕݁ߏ͋ Γ·͢ɻ

Slide 66

Slide 66 text

·ͱΊ

Slide 67

Slide 67 text

·ͱΊ • σʔλͷ΍ΓऔΓΛετϦʔϜͱͯ͠ߟ͑Α͏ • ͱΓ͋͑ͣRxͷετϦʔϜ(Observable)ʹͰ͖ͨ Βͬͪ͜ͷ΋ͷɻͲ͏Ճ޻ͯ͠໨తͷܗࣜʹ͢Δ ͔Λߟ͑Α͏ɻ • RxΛۃΊͨΒϩδοΫ͕γϯϓϧʹ෭࡞༻ͳ͘ɺ εϚʔτʹॻ͚ΔΑ͏ʹͳΔɻඇಉظॲཧ΋ා͘ ͳ͍ʢ͸ͣʣ

Slide 68

Slide 68 text

͍͞͝ʹ • tech vein Ͱ͸͜ΜͳΞϓϦΤϯδχΞɺ
 ϑϦʔϥϯεɾύʔτφʔ༷Λืू͍ͯ͠·͢ɻ • RxSwift, RxJava Λ࢖͍͍ͨ • MVVMɺ CleanArchitectureɺ DI Λ׆༻ͨ͠ઃܭʹڵຯ͕͋Δ ڵຯ͕͋Δํɺͪΐͬͱ࿩Λฉ͍ͯΈ͍ͨํ
 ͨͩ3Yͷ࿩Λ΋ͬͱฉ͖͍ͨํ΋
 ͥͻ͓੠͕͚Լ͍͞ʂ

Slide 69

Slide 69 text

ࢀߟ • ࠓճͷαϯϓϧίʔυஔ͖৔ɹʴ RxCocoa Λ࢖ͬͨ؆୯ͳΞϓ Ϧ • GitHub:
 https://github.com/ecoopnet/rxswift-beginner • ࢀߟهࣄ • Կͱͳ͘RxJavaΛ࢖ͬͯΔ͚Ͳਖ਼௚Α͘෼͔ͬͯͳ͍ਓ͕ಡ Ήͱྑͦ͞͏ͳهࣄɾجૅฤ
 https://qiita.com/k-mats/items/4d374460a3f6284dd09f

Slide 70

Slide 70 text

͕࣌ؒ͋Ε͹αϯϓϧΞϓϦσϞ

Slide 71

Slide 71 text

͝ਗ਼ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠

Slide 72

Slide 72 text

Driver ͷ࢖͍ํ͸ Observable ͱ΄΅ಉ͡

Slide 73

Slide 73 text

Driver ͷ࢖͍ํ͸ Observable ͱ΄΅ಉ͡ʁ →Τϥʔॲཧ͕ཁΒͳ͍౳ͷࡉ͔͍ҧ͍͸͋Δ

Slide 74

Slide 74 text

Driver (ิ଍) ۩ମతʹ͸ observable.asDriver(onErrorJustReturn: “”) ͱ͢Δͱ - UIεϨουͰॲཧɿ .observeOn(MainScheduler.instance) - Cold -> Hot ม׵ɿ .share(replay:1) - Τϥʔ࣌ʹ؂ࢹ͕ࢭ·ΔͷΛ๷͙ͨΊͷϦΧόϦॲཧɿ .catchError({ _ in “” }) Λ·ͱΊͯ΍ͬͯ͘ΕΔΑ͏ʹͳΓ·͢ɻ ˎ