Slide 1

Slide 1 text

RxSwift, RxJavaͷ جຊͱ࣮ફ גࣜձࣾ tech vein ழມ ॆԝ

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

ݸਓతͳࣗݾ঺հ www.ecoop.net ͱ͍͏αΠτΛ2002೥͔ΒӡӦ͍ͯ͠·͢ɻ GNU Make ͱ͍͏ίϚϯυͷӳޠυΩϡϝϯτΛͻͱΓͰίπίπຊҰ࡭෼຋༁ɺ2002೥ʹެ։ͨ͠Γ͠ ·ͨ͠ɻ ࠓ͸ओʹ iOSΞϓϦ։ൃऀΛ͍ͯ͠·͢ɻ WindowsΞϓϦ։ൃ(2000~2003) → PHP։ൃ/Πϯϑϥӡ༻(2003~2012) ˍ Java։ൃ(ΨϥέʔΞϓϦˍJavaEE)(2005~2010) → AndroidΞϓϦ։ൃ(2010~2013) → iPhone ΞϓϦ։ൃ(2013~) ʴ α AndroidʹະདྷΛײͨ͡2010೥ʹΞϓϦΛॳΊͯެ։͠ɺ௨ࢉ15ສμ΢ϯϩʔυΛୡ੒ʂ …͢Δ΋ɺެ։̍िؒͰߋ৽༻ͷ伴Λ๨ΕͯϝϯςφϯεෆՄೳʹ…ɻ

Slide 4

Slide 4 text

ձࣾ(tech vein)ͷ঺հ 2013೥͔Β͋ΔେࡕຊொͷडୗγεςϜ։ൃձࣾͰ͢ɻ Android / iOS εϚʔτϑΥϯΞϓϦ։ൃ΍ɺ WebγεςϜ։ൃ(PHPɾJS)͕ಘҙͰ͢ɻ গਓ਺ͷٕज़తͳ͜ͱɾ໘ന͍͜ͱ͕޷͖ͳϝϯόʔ͕ू·ͬ ͯͰ͖ͨɺখ͞ͳձࣾͰ͢ɻ ձ໊ࣾ͸ςοΫϕΠϯͱಡΈ·͢ɻ

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

ࠓ೔͓࿩͢Δ͜ͱ • RxͷϞνϕʔγϣϯɺخ͍͜͠ͱ • Rx ͷجຊ • εϨουॲཧͱετϦʔϜ݁߹ • (͕࣌ؒ͋Ε͹) Hot / Cold ม׵

Slide 7

Slide 7 text

ࠓ೔͓࿩͠ͳ͍͜ͱ(஌ͬͯΔํ޲͚) • Reactive Streams(backPressure ͳͲ)

Slide 8

Slide 8 text

͸͡Ίʹ • αϯϓϧίʔυ͸͢΂ͯ RxSwift Ͱॻ͔Ε͍ͯ ·͢ɻ • RxJava ΍ RxJSͰ΋جຊ͸ಉ͡Ͱ͕͢ɺࡉ͔ ͍จ๏ɺਖ਼֬ͳϝιου໊͸ҧ͏͜ͱ͕͋Γ ·͢ɻಉ͡༻్ͷϝιου͕͋ΔͷͰɺ࢖͏ ͱ͖͸ஔ͖׵͑ͯԼ͍͞ɻ

Slide 9

Slide 9 text

RxͷϞνϕʔγϣϯ خ͍͜͠ͱ

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Rx=ReactiveXͱ͸Կ͔ʁ ReactiveX = Reactive Extension ൓Ԡతϓϩάϥϛϯά(Reactive Programming)Λ͢ΔͨΊ ͷ֦ுϥΠϒϥϦ(Extensions Library)ͷ͜ͱɻ ReactiveX͸̏ͭͷઃܭࢥ૝Λ૊Έ߹Θͤͯ࡞ΒΕͨϥΠ ϒϥϦͰ͢ɻ - GoF σβΠϯύλʔϯͷ Observable ύλʔϯ - GoF σβΠϯύλʔϯͷ Iterator ύλʔϯ - ؔ਺ܕϓϩάϥϛϯά

Slide 12

Slide 12 text

Α͋͘Δύλʔϯ Rx ͳΜ͔Θ͔ΒΜ Rx ͬͯϦεΫ͕͋Γͦ͏ Rx ͜Θ͍

Slide 13

Slide 13 text

RxΛͳͥ࢖͏͔ ɾ׳ΕΔͱඇಉظॲཧ͕͔ͳΓָʹͳΔɻ ɾ͓͚֮͑ͯ͹৭ʑͳݴޠɺର৅ʹ࢖͑Δɻ ɾෳࡶͳॲཧͰ΋෭࡞༻Λগͳ͘ॻ͚Δɻ
 ɾجຊΛ཈͑Ε͹ҙ֎ͱ؆୯ɻ

Slide 14

Slide 14 text

ˣ ͓୊ɿϢʔβ͕ϘλϯΛԡͨ͠Βɺ ɹɹɹඇಉظॲཧ" #Λ଴ͬͯɺ ɹɹɹ݁ՌΛඇಉظॲཧ$ͰՃ޻ͯ͠ɺ ɹɹɹશ෦ͪΌΜͱΤϥʔॲཧΛͯ͠ ɹɹɹ࠷ޙʹ݁ՌΛը໘ʹදࣔͯ͠ཉ͍͠ɻ

Slide 15

Slide 15 text

ˣ ͓୊ɿϢʔβ͕ϘλϯΛԡͨ͠Βɺ ɹɹɹඇಉظॲཧ" #Λ଴ͬͯɺ ɹɹɹ݁ՌΛඇಉظॲཧ$ͰՃ޻ͯ͠ɺ ɹɹɹશ෦ͪΌΜͱΤϥʔॲཧΛͯ͠ ɹɹɹ࠷ޙʹ݁ՌΛը໘ʹදࣔͯ͠ཉ͍͠ɻ ˞J043Y4XJGUͷίʔυྫ

Slide 16

Slide 16 text

͕͜͜خ͍͠Rx UIΠϕϯτ΍APIɾDBͷඇಉظॲཧͷ࣮ߦ݁ՌͳͲ͋ΒΏΔΠϕϯ τɾσʔλΛ࣌ܥྻσʔλͷετϦʔϜͱͯ͠ॲཧͰ͖Δɻ ಉظతͳɺ஋ɺ഑ྻ͸΋ͪΖΜɺΤϥʔͰ͑͞΋ετϦʔϜͱͯ͠ ѻ͑Δɻ ετϦʔϜࣗମΛΦϒδΣΫτ(Observable)ͱͯ͠ѻ͏͜ͱͰɺෳ ࡶʹͳΓ΍͍͢ඇಉظॲཧ΋ಉظॲཧ΋ಉ͡ΦϒδΣΫτม׵ʹͳ ΓɺγϯϓϧʹͳΔɻ ετϦʔϜΛ࡞ͬͨΓܨ͍ͩΓɺม׵ͨ͠ΓɺՃ޻͢Δศརͳಓ۩ ͕ἧ͍ͬͯΔɻ

Slide 17

Slide 17 text

ڵຯͰ͖ͯ·͔ͨ͠ʁ Ͱ͖ͯ·ͨ͠ΑͶʁ

Slide 18

Slide 18 text

Rxͷجຊ ·ͣ͸Observable͔Β࢝ΊΑ͏

Slide 19

Slide 19 text

Observable → RxͷओཁΫϥε Rx͕࣋ͭ΄ͱΜͲ͢΂ͯͷΫϥε͸Observable ͱͦͷ೿ੜΫϥε(ʴܑఋΫϥε)Ͱ͢ɻ ·ͣ͸ Observable Λ஌Δ͜ͱ͕RxϚελʔ΁ ͷۙಓʹͳΓ·͢ɻ

Slide 20

Slide 20 text

Observable ؂ࢹͯ͠σʔλʢΠϕϯτ)Λड͚औΔࣄ͕Ͱ͖ΔΦϒ δΣΫτͰ͢ɻ ॱ൪ʹσʔλɾΠϕϯτ͕ObservableʹྲྀΕΔ͜ͱ͔ ΒɺObservable͸ετϦʔϜ(Stream)ͱ΋ݺͼ·͢ɻ

Slide 21

Slide 21 text

“Hello” “Rx” “World” Observable completed ࣌ؒͷྲྀΕ Observable ͸ετϦʔϜ

Slide 22

Slide 22 text

͜ͷਤΛʮϚʔϒϧμΠΞάϥϜʯͱ͍͍ɺ ̍ͭͷ໼ҹ͕̍ͭͷετϦʔϜ 0CTFSWBCMF Λද͠·͢ɻ ࠨ͔Βॱ൪ʹΠϕϯτ͕ྲྀΕΔΠϝʔδͰ͢ɻ ̍ͭͷʮ˔ʯ͕̍ͭͷཁૉ͕དྷͨ OFYU ΠϕϯτΛද͠ɺ ʮʛʯ͕ऴྃ DPNQMFUFE ΠϕϯτΛද͠·͢ɻ “Hello” “Rx” “World” Observable completed ࣌ؒͷྲྀΕ

Slide 23

Slide 23 text

“Hello” “Rx” “World” Observable completed ࣌ؒͷྲྀΕ ͜ͷਤΛʮϚʔϒϧμΠΞάϥϜʯͱ͍͍ɺ ̍ͭͷ໼ҹ͕̍ͭͷετϦʔϜ 0CTFSWBCMF Λද͠·͢ɻ ࠨ͔Βॱ൪ʹΠϕϯτ͕ྲྀΕΔΠϝʔδͰ͢ɻ ̍ͭͷʮ˔ʯ͕̍ͭͷཁૉ͕དྷͨ OFYU ΠϕϯτΛද͠ɺ ʮʛʯ͕ऴྃ DPNQMFUFE ΠϕϯτΛද͠·͢ɻ ͜ͷσʔλͷྲྀΕ͕ ͭͷετϦʔϜ ʹ̍ͭͷ0CTFSWBCMF

Slide 24

Slide 24 text

Observable͸࡞੒ɾม׵Ͱ͖Δ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 }

Slide 25

Slide 25 text

Observable͸࡞੒ɾม׵Ͱ͖Δ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 ετϦʔϜ࡞੒

Slide 26

Slide 26 text

Observable͸࡞੒ɾม׵Ͱ͖Δ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 ετϦʔϜม׵

Slide 27

Slide 27 text

Observable͸࡞੒ɾม׵Ͱ͖Δ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 2 completed 6 10 ετϦʔϜม׵

Slide 28

Slide 28 text

subscribe͠ͳ͍ͱετϦʔϜ͸࢝·Βͳ͍ Observable .from([1,2,3,4,5]) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ 0CTFSWBCMF*OU <*OU> ετϦʔϜͷ࡞੒

Slide 29

Slide 29 text

Observable .from([1,2,3,4,5]) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ 0CTFSWBCMF*OU <*OU> ετϦʔϜ 0CTFSWBCMF Λ ฦ͚͢Ͳʜ subscribe͠ͳ͍ͱετϦʔϜ͸࢝·Βͳ͍

Slide 30

Slide 30 text

Observable .from([1,2,3,4,5]) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ 0CTFSWBCMF*OU <*OU> σʔλ͸ྲྀΕͯ͜ͳ͍ʜ ƅшƅ ŴƅŜŖƃʜ subscribe͠ͳ͍ͱετϦʔϜ͸࢝·Βͳ͍

Slide 31

Slide 31 text

Observable .from([1,2,3,4,5]) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ 0CTFSWBCMF*OU <*OU> .subscribe(onNext: { print(“next: \($0)”) }) ։࢝ͯ͠ॳΊͯඇಉظͰॱ൪ʹσʔλ͕ྲྀΕ·͢ɻ ˞Ұ෦ )PU0CTFSWBCMF Λআ͘ ƅшƅ Űŕ ಥવͷTVCTDSJCFʂ subscribe͠ͳ͍ͱετϦʔϜ͸࢝·Βͳ͍

Slide 32

Slide 32 text

subscribeͰετϦʔϜΛ։࢝͢Δ Observable .from([1,2,3,4,5]) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ 0CTFSWBCMF*OU <*OU> .subscribe(onNext: { print(“next: \($0)”) }) lOFYUz਺஋Λϩάग़ྗ͢Δ ετϦʔϜͷ։࢝ ։࢝ͯ͠ॳΊͯඇಉظͰॱ൪ʹσʔλ͕ྲྀΕ·͢ɻ ˞Ұ෦ )PU0CTFSWBCMF Λআ͘

Slide 33

Slide 33 text

subscribeͰετϦʔϜΛ։࢝͢Δ Observable .from([1,2,3,4,5]) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ 0CTFSWBCMF*OU <*OU> .subscribe(onNext: { print(“next: \($0)”) }) lOFYUz਺஋Λϩάग़ྗ͢Δ ετϦʔϜ͔ΒΠϕϯτ σʔλ ͕ྲྀΕΔ ։࢝ͯ͠ॳΊͯඇಉظͰॱ൪ʹσʔλ͕ྲྀΕ·͢ɻ ˞Ұ෦ )PU0CTFSWBCMF Λআ͘

Slide 34

Slide 34 text

subscribeͰετϦʔϜΛ։࢝͢Δ Observable .from([1,2,3,4,5]) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ 0CTFSWBCMF*OU <*OU> .subscribe(onNext: { print(“next: \($0)”) }) lOFYUz਺஋Λϩάग़ྗ͢Δ ετϦʔϜ͔ΒΠϕϯτ σʔλ Λड͚औΔ ˠlOFYUz Λग़ྗ͢Δɻ ։࢝ͯ͠ॳΊͯඇಉظͰॱ൪ʹσʔλ͕ྲྀΕ·͢ɻ ˞Ұ෦ )PU0CTFSWBCMF Λআ͘

Slide 35

Slide 35 text

subscribeͰετϦʔϜΛ։࢝͢Δ Observable .from([1,2,3,4,5]) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ 0CTFSWBCMF*OU <*OU> .subscribe(onNext: { print(“next: \($0)”) }) lOFYUz਺஋Λϩάग़ྗ͢Δ ˠlOFYUz Λग़ྗ͢Δɻ ετϦʔϜ͔ΒΠϕϯτ σʔλ ͕ྲྀΕΔ ։࢝ͯ͠ॳΊͯඇಉظͰॱ൪ʹσʔλ͕ྲྀΕ·͢ɻ ˞Ұ෦ )PU0CTFSWBCMF Λআ͘

Slide 36

Slide 36 text

subscribeͰετϦʔϜΛ։࢝͢Δ Observable .from([1,2,3,4,5]) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ 0CTFSWBCMF*OU <*OU> .subscribe(onNext: { print(“next: \($0)”) }) lOFYUz਺஋Λϩάग़ྗ͢Δ ˠlOFYUz lOFYUz Λग़ྗ͢Δɻ ετϦʔϜ͔ΒΠϕϯτ σʔλ Λड͚औΔ ։࢝ͯ͠ॳΊͯඇಉظͰॱ൪ʹσʔλ͕ྲྀΕ·͢ɻ ˞Ұ෦ )PU0CTFSWBCMF Λআ͘

Slide 37

Slide 37 text

subscribeͰετϦʔϜΛ։࢝͢Δ Observable .from([1,2,3,4,5]) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ 0CTFSWBCMF*OU <*OU> .subscribe(onNext: { print(“next: \($0)”) }) lOFYUz਺஋Λϩάग़ྗ͢Δ ˠlOFYUz lOFYUz Λग़ྗ͢Δɻ ։࢝ͯ͠ॳΊͯඇಉظͰॱ൪ʹσʔλ͕ྲྀΕ·͢ɻ தུ

Slide 38

Slide 38 text

subscribeͰετϦʔϜΛ։࢝͢Δ Observable .from([1,2,3,4,5]) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ 0CTFSWBCMF*OU <*OU> .subscribe(onNext: { print(“next: \($0)”) }) lOFYUz਺஋Λϩάग़ྗ͢Δ ˠlOFYUz lOFYUz ʜ lOFYUz Λग़ྗ͢Δɻ ։࢝ͯ͠ॳΊͯඇಉظͰॱ൪ʹσʔλ͕ྲྀΕ·͢ɻ

Slide 39

Slide 39 text

Q: ετϦʔϜม׵͞Ε͍ͯͨΒ Ͳ͏͍͏ಈ͖ʹ ͳΔͰ͠ΐ͏͔ʁ

Slide 40

Slide 40 text

A. ετϦʔϜม׵͞Ε͍ͯͯ΋ɺ subscribeޙͷॲཧͷྲྀΕ͸ ಉ͡Πϝʔδ

Slide 41

Slide 41 text

subscribe͢Δ·Ͱ΍ͬͺΓσʔλ͸ྲྀΕͳ͍ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> ੩͔ͩʜ ɾТɾA

Slide 42

Slide 42 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> ετϦʔϜͷ։࢝

Slide 43

Slide 43 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 2 completed 6 10

Slide 44

Slide 44 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 2 completed 6 10 ̍͸ح਺ͳͷͰ0,ʂ

Slide 45

Slide 45 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 2 completed 6 10 ̍ˎ̎ʹ̎

Slide 46

Slide 46 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } ˠlOFYUz .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 Λग़ྗ͢Δɻ 2 completed 6 10

Slide 47

Slide 47 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } ˠlOFYUz .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 Λग़ྗ͢Δɻ 2 completed 6 10

Slide 48

Slide 48 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } ˠlOFYUz .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 Λग़ྗ͢Δɻ ̎͸ۮ਺ͳͷͰεΩοϓʂ 2 completed 6 10

Slide 49

Slide 49 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } ˠlOFYUz .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 Λग़ྗ͢Δɻ 2 completed 6 10

Slide 50

Slide 50 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } ˠlOFYUz .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 Λग़ྗ͢Δɻ 2 completed 6 10 ̏͸ح਺ͳͷͰ0,ʂ

Slide 51

Slide 51 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } ˠlOFYUz .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 Λग़ྗ͢Δɻ 2 completed 6 10 ̏ˎ̎ʹ̒

Slide 52

Slide 52 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } ˠlOFYUz lOFYUz .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 Λग़ྗ͢Δɻ 2 completed 6 10

Slide 53

Slide 53 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } ˠlOFYUz lOFYUz lOFYUz Λग़ྗ͢Δɻ .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 2 completed 6 10 தུ

Slide 54

Slide 54 text

Observable͸ඇಉظʹॱʹσʔλ͕ྲྀΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } ˠlOFYUz lOFYUz lOFYUz Λग़ྗ͢Δɻ .subscribe(onNext: { print(“next: \($0)”) }) < > ഑ྻ͔Β0CTFSWBCMFετϦʔϜΛ࡞Δ ح਺͚ͩ࢒͢ϑΟϧλΛ͔͚Δ ̎ഒͷ஋ʹม׵͢Δ lOFYUz਺஋Λϩάग़ྗ͢Δ 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> 1 completed 2 3 4 5 1 completed 3 5 2 completed 6 10

Slide 55

Slide 55 text

Observable ͸ subscribeͨ͠Βಈ͖ग़͢ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } .subscribe(onNext: { print(“next: \($0)”) }) 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> TVCTDSJCF TVCTDSJCF TVCTDSJCF

Slide 56

Slide 56 text

ಈ͖ग़ͨ͠Β্ྲྀ͔ΒԼྲྀʹΠϕϯτ(σʔλ)͕ྲྀ ΕΔ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } .subscribe(onNext: { print(“next: \($0)”) }) 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> TVCTDSJCF TVCTDSJCF TVCTDSJCF PO/FYU PO/FYU PO/FYU

Slide 57

Slide 57 text

ετϦʔϜʹྲྀΕΔ Πϕϯτͷछྨ

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

ετϦʔϜͷΠϕϯτ next completed next next next next next completed next next ετϦʔϜ͸ next ͰσʔλΛྲྀ͠ɺDPNQMFUFEͰऴྃ͢Δ DPNQMFUFE͕དྷͨΒɺͦͷઌ͸OFYUFSSPS͸ྲྀΕͳ͍ ྲྀͤͳ͍ next next next FSSPS ྫ֎ ͕དྷͨΒɺͦͷઌ͸OFYUDPNQMFUFEFSSPS͸ྲྀΕͳ͍ ྲྀͤͳ͍ error next next next next next DPNQMFUFE͠ͳ͍ετϦʔϜͰӬٱʹOFYUΛ଴ͪଓ͚Δ͜ͱ΋Ͱ͖Δ next

Slide 60

Slide 60 text

Observableͷ·ͱΊ - Observable͸ετϦʔϜ - ԿͰ΋Observableʹ͢Δࣄ͕Ͱ͖Δ - Observable͸ม׵ͯ͠ผͷObservableΛੜ੒͢Δ͜ͱ͕Ͱ ͖Δ - subscribeͰετϦʔϜ͔ΒσʔλΛड͚औΔ - جຊతʹ subscribe ͢Δ·Ͱ͸ετϦʔϜ͕ྲྀΕͳ͍ - subscribeͨ͠Β࿈࠯Ͱඇಉظʹσʔλ͕ྲྀΕग़͢

Slide 61

Slide 61 text

Πϕϯτͷ·ͱΊ ObservableͰड͚औΔΠϕϯτ͸ جຊ next, error, completed ͚ͩɻ (ଞʹ͸disposed, subscribedΠϕϯτΛड͚औΕͨΓ͠·͕͢ɺ͋·Γ࢖Θͳ͍Ͱ͢)

Slide 62

Slide 62 text

ετϦʔϜ࣮ߦͷऴྃॲཧ (Disposable) ετϦʔϜΛ։࢝(subscribe) ͢Δͱ໭Γ஋ͱͯ͠ Disposable Λฦ͠·͢ɻ Disposableʹରͯ͠dispose()ΛݺͿ͜ͱͰɺඇಉظॲཧͷΩϟ ϯηϧͳͲɺ؂ࢹ͢Δଆͱͯ͠ॲཧΛࢭΊΔࣄ͕Ͱ͖·͢ɻ ྫɿը໘Λดͨ͡Β௨৴Ωϟϯηϧͨ͠Γɺೖྗ଴ͪΛࢭΊͨ Γ͢Δɻ

Slide 63

Slide 63 text

Ϣʔβ͔ΒͷϘλϯೖྗΠϕϯτΛ ଴ͪଓ͚Δ0CTFSWBCMF 0CTFSWBCMF*OU Disposableͷ࢖͍ํ %JTQPTBCMF TVCTDSJCF͸ %JTQPTBCMFΛฦ͢ let observable: Observable = executeButton.rx.tap .asObservable() EJTQPTFͰ TVCTDSJCFΛఀࢭ let disposable = observable.subscribe(onNext: { print(“Ϙλϯ͕ԡ͞Ε·ͨ͠”) }) ্ͷ0CTFSWBCMFΛ TVCTDSJCFͰ଴ͪଓ͚ΔॲཧΛ։࢝

Slide 64

Slide 64 text

͍ͭDispose͢Δͷ͔ʁ ॲཧ͕׬ྃͨ࣌͠(completed / error͕ྲྀΕͨ ࣌)͸ࣗಈͰ dispose ͞Ε·͢ɻ ௕͕͔͔࣌ؒ͘Δॲཧ΍ɺͣͬͱ଴ͪଓ͚ΔϢʔ βΫϦοΫΠϕϯτͷ؂ࢹͳͲ͸ɺը໘Λด ͨ͡ͱ͖ͳͲɺෆཁʹͳͬͨλΠϛϯάͰ disposeͰΩϟϯηϧɾఀࢭͤ͞·͢ɻ

Slide 65

Slide 65 text

CompositeDisposable ؅ཧର৅ͷ Disposable Λ·ͱΊͯdisposeͰ ͖ΔΫϥεɻը໘಺ͷdisposableΛҰׅఀࢭ ͤ͞Δ࣌ͳͲʹͱͯ΋ศརͰ͢ɻ

Slide 66

Slide 66 text

ิ଍ɿRxSwiftͷDisposeBag ը໘ͳͲɺ؂ࢹݩΠϯελϯε͕ࢮΜͩΒࣗ ಈͰͥΜͿdisposeͤ͞Δͱ͖ʹ࢖͑Δศར Ϋϥεɻ ˠ3Yඪ४Ͱ͸ͳ͍Ͱ͕͢ɺ3Y4XJGUͰ͸ $PNQPTJUF%JTQPTBCMFͷ୅ΘΓʹ%JTQPTF#BHΛ ࢖͍·͢ɻ

Slide 67

Slide 67 text

ൃలฤ

Slide 68

Slide 68 text

ϚϧνεϨουॲཧ Observableʹ͸ - (্ྲྀͷ)ΠϕϯτൃߦΛͲͷεϨουͰॲཧ͢Δ͔ - (ԼྲྀͰ)ड͚औΔ࣌ʹͲͷεϨουͰॲཧ͢Δ͔ ͷ̎छྨͷεϨουίϯτϩʔϧϝιου͕͋Γ· ͢ɻ

Slide 69

Slide 69 text

ϚϧνεϨουॲཧ - (্ྲྀͷ)ΠϕϯτൃߦΛͲͷεϨουͰॲཧ͢Δ͔ → subscribeOn(<εϨουࢦఆ>) ྫɿAPIͷ௨৴࣮ߦεϨουΛόοΫͰಈ͔͍ͨ͠ - (ԼྲྀͰ)ड͚औΔ࣌ʹͲͷεϨουͰॲཧ͢Δ͔ → observeOn(<εϨουࢦఆ>) ྫɿ݁Ռදࣔ͸UIεϨουͰॲཧ͍ͨ͠

Slide 70

Slide 70 text

্ྲྀͷεϨουΛม͑Δ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .subscribe(onNext: { print(“next: \($0)”) }) 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> TVCTDSJCF TVCTDSJCF PO/FYU PO/FYU TVCTDSJCF࣮ߦεϨου ϝΠϯεϨου όοΫάϥ΢ϯυεϨου

Slide 71

Slide 71 text

্ྲྀͷεϨουΛม͑Δ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .subscribe(onNext: { print(“next: \($0)”) }) 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> TVCTDSJCF TVCTDSJCF TVCTDSJCF PO/FYU PO/FYU PO/FYU .subscribeOn(ConcurrentD ispatchQueueScheduler(qos : .background)) TVCTDSJCF࣮ߦεϨου ϝΠϯεϨου όοΫάϥ΢ϯυεϨου

Slide 72

Slide 72 text

ԼྲྀͷεϨουΛม͑Δ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .subscribe(onNext: { print(“next: \($0)”) }) 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> TVCTDSJCF TVCTDSJCF PO/FYU PO/FYU TVCTDSJCF࣮ߦεϨου ϝΠϯεϨου όοΫάϥ΢ϯυεϨου

Slide 73

Slide 73 text

ԼྲྀͷεϨουΛม͑Δ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .subscribe(onNext: { print(“next: \($0)”) }) 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> TVCTDSJCF TVCTDSJCF TVCTDSJCF PO/FYU PO/FYU PO/FYU .observeOn(MainSchedula r.instance) TVCTDSJCF࣮ߦεϨου ϝΠϯεϨου όοΫάϥ΢ϯυεϨου

Slide 74

Slide 74 text

૊Έ߹Θͤ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .subscribe(onNext: { print(“next: \($0)”) }) 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> TVCTDSJCF TVCTDSJCF TVCTDSJCF PO/FYU PO/FYU PO/FYU .subscribeOn(ConcurrentD ispatchQueueScheduler(qos : .background)) .observeOn(MainSchedula r.instance) PO/FYU TVCTDSJCF TVCTDSJCF࣮ߦεϨου ϝΠϯεϨου όοΫάϥ΢ϯυεϨου 0CTFSWBCMF*OU

Slide 75

Slide 75 text

ϚϧνεϨουॲཧͷ·ͱΊ APIͳͲཪͰ࣮ߦ͍ͨ͠ॏ͍ॲཧ͸ subscribeOn() ͰόοΫάϥ΢ϯυεϨουΛࢦఆ͢Δɻ ड͚औΓΛϝΠϯεϨουͰߦ͍͍ͨ࣌͸ observeOn()ͰϝΠϯεϨουΛࢦఆ͢Δɻ εϚϗΞϓϦ։ൃͰ͸͜Ε͚͓͚֮ͩ͑ͯ͹OKɻ

Slide 76

Slide 76 text

ετϦʔϜ݁߹

Slide 77

Slide 77 text

Observable͸৭ʑͳํ๏(Φ ϖϨʔλ)Ͱ࿈݁ɾ݁߹͢Δ͜ ͱ͕Ͱ͖·͢ ɾObservableม׵(طग़ / ݁ՌΛड͚औͬͯॱ൪ʹॲཧ ͢Δ) ɾฒྻͭͳ͗(ObservableΛಉ࣮࣌ߦ͢Δ) ɾ௚ྻͭͳ͗(Observableͷ݁ՌΛड͚औͬͯผͷ ObservableΛॲཧ͢Δ)

Slide 78

Slide 78 text

Observable .zip( ) ฒྻͭͳ͗(zip ΦϖϨʔλ) Observable .from([1,2,3,4,5]) 0CTFSWBCMF*OU 0CTFSWBCMF*OU Observable .from([10,9,8,7,6]) 0CTFSWBCMF*OU 0CTFSWBCMF *OU *OU .map { a, b in a * b }

Slide 79

Slide 79 text

Observable .zip( ) ฒྻͭͳ͗(zip ΦϖϨʔλ) Observable .from([1,2,3,4,5]) 0CTFSWBCMF*OU 0CTFSWBCMF*OU Observable .from([10,9,8,7,6]) 0CTFSWBCMF*OU 0CTFSWBCMF *OU *OU .map { a, b in a * b } [JQΦϖϨʔλͰ " #݁߹ ී௨ͷ0CTFSWBCMF" ී௨ͷ0CTFSWBCMF# ݁߹݁Ռ͸ " # " # ͱ͍͏ετϦʔϜ

Slide 80

Slide 80 text

.flatMap{ a in } self.fetchAPI(a) ௚ྻͭͳ͗(flatMap ΦϖϨʔλ) Observable .from([1,2,3,4,5]) B*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU .map { $0 * 2 }

Slide 81

Slide 81 text

.flatMap{ a in } self.fetchAPI(a) ௚ྻͭͳ͗(flatMap ΦϖϨʔλ) Observable .from([1,2,3,4,5]) B*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU qBU.BQΦϖϨʔ λͰ "͔Β#ʹͭͳ͙ ී௨ͷ0CTFSWBCMF" "͔ΒྲྀΕͨ஋Λ࢖͍ɺ "1*௨৴ͯ݁͠ՌΛྲྀ͢ 0CTFSWBCMF# .map { $0 * 2 }

Slide 82

Slide 82 text

෼ׂ΋Ͱ͖Δ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .map { $0 * 2 } .subscribe(onNext: { print(“next: \($0)”) }) 0CTFSWBCMF*OU 0CTFSWBCMF*OU 0CTFSWBCMF*OU <*OU> %JTQPTBCMF

Slide 83

Slide 83 text

෼ׂ΋Ͱ͖·͢ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .subscribe(onNext: { print(“next: \($0)”) }) 0CTFSWBCMF*OU <*OU> .map { $0 * 2 } .subscribe(onNext: { print(“next: \($0)”) }) 0CTFSWBCMF*OU 0CTFSWBCMF*OU .subscribe(onNext: { print(“next: \($0)”) }) %JTQPTBCMF %JTQPTBCMF %JTQPTBCMF

Slide 84

Slide 84 text

෼ׂͨ͠৔߹͸subscribe࣌ʹετϦʔϜม׵աఔ ͕ෳ੡͞Ε·͢ɻ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } .subscribe(onNext: { print(“next: \($0)”) }) 0CTFSWBCMF*OU <*OU> .map { $0 * 2 } 0CTFSWBCMF*OU 0CTFSWBCMF*OU .subscribe(onNext: { print(“next: \($0)”) }) Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } 0CTFSWBCMF*OU <*OU> 0CTFSWBCMF*OU .map { $0 * 2 } .subscribe(onNext: { print(“next: \($0)”) }) 0CTFSWBCMF*OU Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } 0CTFSWBCMF*OU <*OU> 0CTFSWBCMF*OU %JTQPTBCMF %JTQPTBCMF %JTQPTBCMF ͢΂ͯผͷաఔͰ ετϦʔϜΛ TVCTDSJCF͍ͯ͠Δ

Slide 85

Slide 85 text

(தڃ)ෳ੡ͤ͞ͳ͍ͨΊͷtips Hot ͱ Cold Observable ͸ Cold / Hot ʹ෼͔Ε͍ͯͯɺ جຊ͸໌ࣔతʹHotม׵͠ͳ͍ݶΓ Cold Observable ͱࢥ͓͍ͬͯ ͨ΄͏͕͍͍Ͱ͢ɻ(ݫີʹ͸ҧ͍·͕͢؆୯ͷͨΊ) Cold͸subscribe͞ΕΔ·Ͱಈ͔ͣɺsubscribeͷ౎౓ෳ੡͞ΕΔ(1͔ ΒετϦʔϜ͕࢝·Δ)ͱ͍͏ಛ௃͕͋Γ·͢ɻ Hot͸subscribe͞Εͳͯ͘΋ಈ͖ɺ̎ͭҎ্ͷsubscribe͕͋ͬͯ΋ ಉ͡ετϦʔϜΛڞ༗͠·͢ɻ

Slide 86

Slide 86 text

Hot / Cold ม׵: Cold → Hot share(), shareReplay(), publish() ͳͲͷ Hotม׵ΦϖϨʔλʹΑΓHot ʹม׵Ͱ͖· ͢ɻ

Slide 87

Slide 87 text

Hot / Cold ม׵: Hot → Cold share(), shareReplay(), publish() Ҏ֎ͷ΄΅ ͢΂ͯͷΦϖϨʔλ͸ Cold ͳ Observable Λฦ͠·͢ɻ ྫɿ filter, map, from, flatMap, zipͳͲ

Slide 88

Slide 88 text

Hotม׵ͱݺ͹ΕΔΦϖϨʔλʹΑΓɺ ෳ੡͞Εͳ͘ͳΓ·͢ɻ Observable .from([1,2,3,4,5]) .filter { $0 % 2 == 1 } 0CTFSWBCMF*OU <*OU> 0CTFSWBCMF*OU %JTQPTBCMF .share() %JTQPTBCMF IPUม׵ͷྫ TIBSF ΦϖϨʔλ 0CTFSWBCMF*OU .subscribe(onNext: { print(“next: \($0)”) }) .subscribe(onNext: { print(“next: \($0)”) }) ಉ͡ετϦʔϜΛ࢖͍ճ͢ ʹ৽ͨʹੜ੒͠ͳ͍͍ͯ͘෼ίετ͕௿͍

Slide 89

Slide 89 text

Hotม׵ͷϝϦοτ ɾԿ౓΍ͬͯ΋ಉ݁͡ՌʹͳΔ͕ɺॲཧʹ࣌ ͕͔͔ؒΔίετ୹ॖͰ͖Δ Hotม׵ͷσϝϦοτ ɾཧղͤͣʹ࢖͏ͱλΠϛϯάʹΑͬͯ͸ظ଴௨Γ Πϕϯτ͕དྷͳ͘ͳΓɺϋϚΔɻ (ઌʹଞͷsubscribe()͕͍Δ͔Ͳ͏͔Ͱڍಈ͕ม ΘͬͨΓ͢Δ)

Slide 90

Slide 90 text

ColdͷϝϦοτ ɾΘ͔Γ΍͍͢ ColdͷσϝϦοτ ɾ৔߹ʹΑͬͯ͸ॲཧ͕ॏ͘ͳΔ →ύϑΥʔϚϯεͷ໰୊͕ग़͔ͯΒ ɹHot/Coldʹ͍ͭͯௐ΂Ε͹OKͩͱࢥ͍· ͢ɻ

Slide 91

Slide 91 text

Hot / Cold ·ͱΊ ׳ΕͨΒ࢖ͬͯΈΑ͏ɻ ׳Εͳ͍͏ͪ͸৮Βͳ͍΄͏͕٢ɻ

Slide 92

Slide 92 text

·ͱΊ • Πϕϯτɾσʔλ͸ԿͰ΋RxԽͰ͖ΔɻΠϕϯ τɾσʔλͷ΍ΓऔΓΛετϦʔϜͱͯ͠ߟ͑Α ͏ • ॲཧͷεςοϓ(ϑΟϧλɺܭࢉɺσʔλಡΈॻ͖) ΛετϦʔϜม׵ͱଊ͑Α͏ɻ • RxΛۃΊͨΒඇಉظॲཧ΋γϯϓϧʹ෭࡞༻ͳ ͘ɺεϚʔτʹॻ͚ΔΑ͏ʹͳΓ·͢ɻ

Slide 93

Slide 93 text

Rx ͸؆୯ʹࢼͤ·͢ • Java, Kotlin ։ൃ؀ڥ͕͋ΔͳΒ… • Grade Ͱ RxJava2, RxAndroid, RxKotlinΛೖΕͯΈΔɻ • Swift ։ൃ؀ڥ͕͋ΔͳΒ… • CocoaPods Ͱ RxSwiftΛೖΕͯΈΔɻ • Ͳͬͪ΋ͳ͍৔߹ • RxJS Playground ͰͳΜͱϒϥ΢βͰࢼͤΔʂ • https://rxjs-playground.github.io/ (RxJS Playground Ͱݕࡧ)

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

ࢀߟ • RxSwift / RxJava Observable νʔτγʔτ
 https://docs.google.com/spreadsheets/u/1/d/ 12C3MLr2RfrYPezHJTmjruDt3i8TRZGCJDnVz86vo39g/edit#gid=0 • SubjectͱRelayͷҧ͍ͳͲObservableͷ೿ੜΫϥεͷ࢓༷Λ·ͱΊͨਤͰ͢ɻ • RxSwift + RxCocoa Λ࢖ͬͨ؆୯ͳΞϓϦ • GitHub:
 https://github.com/ecoopnet/rxswift-beginner • ࢀߟهࣄ • Կͱͳ͘RxJavaΛ࢖ͬͯΔ͚Ͳਖ਼௚Α͘෼͔ͬͯͳ͍ਓ͕ಡΉͱྑͦ͞͏ͳهࣄɾجૅฤ
 https://qiita.com/k-mats/items/4d374460a3f6284dd09f

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

͓·͚ɿRxͷجຊ Rxͷߟ͑ํͷجૅ

Slide 98

Slide 98 text

ReactiveXͱ͸Կ͔ʁ ReactiveX = Reactive Extension ൓Ԡతϓϩάϥϛϯά(Reactive Programming)Λ͢ΔͨΊ ͷ֦ுϥΠϒϥϦ(Extensions Library)ͷ͜ͱɻ ReactiveX͸̏ͭͷઃܭࢥ૝Λ૊Έ߹Θͤͯ࡞ΒΕͨϥΠ ϒϥϦͰ͢ɻ - GoF σβΠϯύλʔϯͷ Observable ύλʔϯ - GoF σβΠϯύλʔϯͷ Iterator ύλʔϯ - ؔ਺ܕϓϩάϥϛϯά ʁ ࠶ܝ

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

0CTFSWFS͕4VCKFDUʹBEE0CTFSWFSͰࣗ෼Λొ࿥

Slide 101

Slide 101 text

݁Ռ௨஌͢Δͱ͖͸4VCKFDU͕OPUJGZ͢Δ

Slide 102

Slide 102 text

$PODSFUFΫϥεಉ࢜͸ɺ ͓ޓ͍Λ஌Βͳ͍··ɺଟରଟͷؔ܎Ͱɺ ΠϕϯτΛ΍ΓऔΓͰ͖Δ

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

࣍ͷσʔλΛॱ൪ʹ next() Ͱऔͬͯ͘Δ͚ͩͳͷͰɺ Iteratorͷ࣮ମ͕Կ݅͋ͬͯ΋ɺͲ͏͍͏σʔλߏ଄Ͱ͋ͬͯ΋ɺ ͨͱ͑σʔλ͕શ෦ἧ͍ͬͯͳͯ͘΋ɺಉ͡ํ๏Ͱॱ൪ʹऔಘͰ͖Δ ʁ *UFSBUPS 4USJOH ·ͩ͋Δʁ IBT/FYU ͋ΔΑ USVF ͍ͩ͘͞ OFYU Ͳ͏ͧ lIPHFz

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

Rx ʹ Observerύλʔϯ + Iterator ύλʔϯ + ؔ਺ܕϓϩάϥϛϯά ग़యIUUQSFBDUJWFYJP