Slide 1

Slide 1 text

RxExample͔ΒֶͿʂ RxSwift @kazu0620

Slide 2

Slide 2 text

ࣗݾ঺հ ࡔຊ ࿨େ( @kazu0620 ) Sansanגࣜձࣾ Eightࣄۀ෦ॴଐ աڈʹݸਓͰ։ൃͨ͠ΞϓϦ - ൿີͷΞϧόϜ(40ສDL!) - ʹΌΜ͜(15ສDL!)

Slide 3

Slide 3 text

RxExampleͱ͸ʁ

Slide 4

Slide 4 text

RxExample • ެࣜϦϙδτϦʹؚ·ΕͯΔRxSwiftͷ࢖༻ྫ • ඇৗʹγϯϓϧͳྫ͔ΒɺMVVMͰهड़͞Ε ࣮ͨ੎తͳྫ·Ͱɺ਺ଟ͘ͷαϯϓϧ͕͋Δɻ • RxSwiftΛͲ͏࢖͑͹ྑ͍͔ɺͲ͏࢖ͬͯ΄͠ ͍ͱ૝૾ͯ͠࡞ΒΕ͍ͯΔͷ͔Θ͔Δ

Slide 5

Slide 5 text

git clone [email protected]:ReactiveX/RxSwift.git Ҏ߱ͷ͓࿩͸ͥͻɺRxExampleͷίʔυ Λݟͳ͕Β͓ฉ͖͍ͩ͘͞ɻ

Slide 6

Slide 6 text

ͷExamplesҎԼͷσΟϨΫτϦɻ

Slide 7

Slide 7 text

Numbers

Slide 8

Slide 8 text

3ͭͷTextFieldʹͦΕͧΕ਺஋Λೖྗ͢Δͱɺ ϦΞϧλΠϜʹͦͷ߹ܭ͕ग़ྗ͞ΕΔɻ

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

rx_text: TextFieldͷtextʹมߋ͕͋ͬͨ৔߹ʹͦͷ஋Λemit͢Δɻྫ ͑͹શͯͷTextFieldʹ1,2,3ͱ͍͏਺஋Λॱʹೖྗͨ͠ͱ͖͸ɺԼهͷ ༷ͳγʔέϯεͱͳΔɻ

Slide 11

Slide 11 text

combineLatest: ͦΕͧΕͷγʔέϯεͷ࠷ޙʹൃߦͨ͠஋Λ߹੒͠ ͯɺ৽͍͠γʔέϯεΛੜ੒͢ΔɻʮͲͷγʔέϯεΛ߹੒͢Δ͔ʁʯ ͱʮͲ͏΍ͬͯ߹੒͢Δ͔ʁʢΫϩʔδϟʹॻ͘)Λࢦఆ͢Δ͜ͱ͕Ͱ ͖Δɻ + +

Slide 12

Slide 12 text

map: ετϦʔϜͷཁૉΛม׵͠ɺ৽ͨͳετϦʔϜΛੜ੒͢Δɻ഑ྻʹର ͯ͠mapΛ࣮ߦ͢Δͷͱಉ͡Α͏ʹߟ͑ΔͱΘ͔Γ΍͍͢ɻ্هͷmap͸ combineLatest͕ฦ͢ཁૉ͸਺஋ܕͳͷͰɺͦΕΛdescriptionΛ༻͍ͯString ʹม׵͍ͯ͠Δɻ

Slide 13

Slide 13 text

bindTo: ετϦʔϜͷཁૉ͕ྲྀΕͯ͘ΔͷΛߪಡ͠ɺͦͷཁૉΛର ৅(UI෦඼ͳͲ)ʹඥ෇͚Δɻͱ͍͏ॲཧΛ؆୯ʹॻ͚Δɻ͘͢͝ஸೡ ʹॻ͘ͱɺԼهͱಉ͜͡ͱΛ͍ͯ͠Δɻ

Slide 14

Slide 14 text

subscribe: ετϦʔϜʹྲྀΕͯ͘ΔཁૉΛߪಡ͢Δ͜ͱ͕ग़དྷΔɻ ਖ਼ৗʹ஋͕ྲྀΕ͖ͯͨ৔߹: .Next Τϥʔ͕ൃੜͨ͠৔߹: .Error ετϦʔϜ͕ऴྃͨ͠৔߹: .Completed subscribeNext, subscribeError ͳͲͰΠϕϯτΛࢦఆͯ͠ߪಡ ͢Δ͜ͱ΋Մೳɻ

Slide 15

Slide 15 text

addDisposableTo: ߪಡͷഁغΛ؅׋͢ΔDisposeBagΛࢦఆ ͢Δɻ͜Ε͕ͳ͍ͱɺετϦʔϜΛӬԕʹߪಡͨ͠··ʹͳͬͯ͠· ͏৔߹͕͋ΔͷͰ஫ҙɻ DisposeBag: bagΛอ࣋͢ΔΠϯελϯε͕dealloc͞ΕͨλΠϛ ϯάͰɺอ࣋͢Δ͢΂ͯͷߪಡΛղ์͢Δɻͭ·ΓɺNumbersͷྫͰ ݴ͏ͱViewController͕dealloc͞ΕΔλΠϛϯάͰɺετϦʔϜͷߪ ಡ΋͢΂ͯऴྃ͢Δɻ

Slide 16

Slide 16 text

SimpleValidation

Slide 17

Slide 17 text

UsernameɺPasswordͷTextFieldʹೖྗ͞Εͨจ ࣈ਺ʹΑͬͯಈతʹද͕ࣔมԽ͢Δʢ੺͍ܯࠂจ ࣈ͕ফ͑Δ / Ϙλϯ͕disable͔ΒenableʹͳΔʣ

Slide 18

Slide 18 text

map(෮श): ετϦʔϜʹྲྀΕͯ͘Δཁૉ͸ɺrx_textͳͷͰจࣈ ྻɻͰ΋ࠓճ͸ɺ࠷ऴతʹ͸͜ΕΛhidden(BOOL)ͱ͔ enabled(BOOL)ʹɺbind͍ͨ͠ͱ͍͏اըɻͳͷͰɺmapΛར༻͠ ͯཁૉΛString͔Β5จࣈҎ্͔Ͳ͏͔(BOOL)ʹม׵͍ͯ͠Δɻ

Slide 19

Slide 19 text

͜͜Ͱ͸ઌ΄Ͳ࡞ͬͨusernameValidͱpasswordValidͷετϦʔϜ Λ߹੒ͯ͠ɺ͍ͣΕ΋Trueͩͬͨͱ͖ͷΈTrueΛྲྀ͢ετϦʔϜΛ৽ ͨʹੜ੒͍ͯ͠Δɻ combineLatest: ͦΕͧΕͷγʔέϯεͷ࠷ޙʹൃߦͨ͠஋Λ߹੒͠ ͯɺ৽͍͠γʔέϯεΛੜ੒͢ΔɻʮͲͷγʔέϯεΛ߹੒͢Δ͔ʁʯ ͱʮͲ͏΍ͬͯ߹੒͢Δ͔ʁʢΫϩʔδϟʹॻ͘)Λࢦఆ͢Δ͜ͱ͕Ͱ ͖Δɻ

Slide 20

Slide 20 text

bindTo(෮श): ετϦʔϜͷཁૉΛUIViewͷϓϩύςΟʹඥ෇͚͍ͯΔɻ addDisposableTo: (෮श): ετϦʔϜͷߪಡऴྃΛ؅ཧ͢ΔDisposeBag ʹͦΕͧΕͷߪಡΛొ࿥͍ͯ͠Δɻ

Slide 21

Slide 21 text

subscribeNext(෮श): ετϦʔϜʹྲྀΕͯ͘ΔΠϕϯτ(ࠓճ͸ UIButtonͷλοϓ)Λߪಡ͠ɺϋϯυϦϯά͢Δɻ

Slide 22

Slide 22 text

গ͠࿩Λ໭͢

Slide 23

Slide 23 text

shareReplay: ετϦʔϜΛHotม׵͠ɺ෼ذ͍ͤͯ͞Δɻ

Slide 24

Slide 24 text

Observable • γʔέϯεͷܭࢉํ๏/खଓΛఆٛͨ͠΋ͷɻ ఆ͚ٛͨͩ͠ͳͷͰɺߪಡ(subscribe)͢Δ· Ͱ͸࣮ߦ͞ΕΔ͜ͱ͸ͳ͍ɻٯʹݴ͏ͱɺ subscribe͞Εͨ࣌఺Ͱఆٛͨ͠ܭࢉ͕࣮ߦ͞ ΕΔɻ

Slide 25

Slide 25 text

bindTo(෮श): ΍͍ͬͯΔ͜ͱ͸ɺsubscribeͯ͠.NextͰର৅ͷUIViewͷ ϓϩύςΟΛมߋ͍ͯ͠Δͷͱಉ͡ɻ

Slide 26

Slide 26 text

shareReplay͍ͯ͠ͳ͍ͱ͖

Slide 27

Slide 27 text

্هͷίʔυ͸ಉҰͷObservableΛ2ճߪಡ(subscribe)͍ͯ͠Δɻઌ ΄Ͳઆ໌ͨ͠Α͏ʹɺObservable͸ subscribe͞Εͨ࣌఺Ͱఆٛͨ͠ܭࢉ͕࣮ߦ͞ΕΔ ͭ·Γ2ճsubscribe͢Δͱɺ2ຊͷετϦʔϜ͕ੜ· Εɺ2ճܭࢉ͕࣮ߦ͞ΕΔ

Slide 28

Slide 28 text

shareReplay͕ͳ͍৔߹ɺ͜ͷmap͕2ճ(subscribeͨ͠਺͚ͩ)࣮ߦ͞ Εͯ͠·͏ɻ ͜Ε͘Β͍ͷॲཧͳΒͨ͘͞Μ૸ͬͯ΋໰୊ͳ͍͕ɺ৔߹ʹΑͬͯ͸ ҙਤͤͣແବͳܭࢉϦιʔεΛ࢖ͬͯ͠·͏͜ͱʹͳΔɻ

Slide 29

Slide 29 text

HotͱCold

Slide 30

Slide 30 text

ShareReplay͍ͯ͠ͳ͍Observable ShareReplayͨ͠Observable ্هͷਤ͸ʮRxͷHotͱColdʹ͍ͭͯʯΑΓҾ༻ (http://qiita.com/toRisouP/items/f6088963037bfda658d3)

Slide 31

Slide 31 text

SimpleTableViewExample

Slide 32

Slide 32 text

γϯϓϧͳTableViewΛRxSwiftͷbindingػߏΛ ࢖࣮ͬͯݱ͢Δɻ

Slide 33

Slide 33 text

഑ྻΛObservableʹแΉɻ͜͜Ͱ͸SampleͳͷͰ؆қʹ഑ྻΛཁૉ ͱͯ࣋ͬͨ͠ObservableΛੜ੒͢ΔͨΊ্هͷΑ͏ʹهड़͍ͯ͠Δͩ ͚ɻ ࣮ࡍʹ͸ɺAPI௨৴ʹΑͬͯऔಘͨ͠഑ྻΛཁૉͱͯ࣋ͭ͠ ObservableΛTableViewʹbind͢ΔɺͳͲͷέʔε͕ଟ͍͸ͣɻ

Slide 34

Slide 34 text

഑ྻΛཁૉͱͯ࣋ͬͨ͠ObservableΛtableViewʹbind͍ͯ͠Δɻ͜ Ε͚ͩͰTableViewͷද͕ࣔͰ͖Δɻ CellͷIdentifierͱܕΛҾ਺ʹ౉͠ɺΫϩʔδϟ಺ͰCellͷॳظԽॲཧ Λ࣮૷͢Δ͚ͩɻ row: IndexPath.row element: bind͞ΕͨObservableͷཁૉ(ࠓճ͸จࣈྻ) cell: ੜ੒͞ΕͨTableViewCell

Slide 35

Slide 35 text

rx_modelSelected: Cell͕Select͞Εͨ࣌ͷΠϕϯτΛemit͢ΔɻҾ਺ (String)͸bindͨ͠ཁૉͷܕΛࢦఆ͢Δɻ rx_itemAccessoryButtonTapped: Cellʹ഑ஔ͞Ε͍ͯΔ AccessoryButton͕λοϓ͞Εͨ࣌ͷΠϕϯτΛemitɻ

Slide 36

Slide 36 text

GitHubSignup(Driver൛)

Slide 37

Slide 37 text

GitHubͷΞΧ΢ϯτΛ৽͘͠ొ࿥͢ΔॲཧΛRxSwiftͰ࣮૷ (ΞΧ΢ϯτͷੜ੒෦෼͸MockͳͷͰຊ౰ʹΞΧ΢ϯτ͕࡞ΒΕΔ͜ͱ͸ͳ͍) ɾDriverΛ༻͍ͨUIύʔπ΁ͷόΠϯσΟϯάॲཧ ɾViewModelΛ༻͍ͨϓϨθϯςʔγϣϯϩδοΫͷ෼཭ ɾAPIϦΫΤετΛ࣮ߦ͢Δ௨৴ॲཧ ΈͲ͜Ζ

Slide 38

Slide 38 text

Driverͱ͸ʁ

Slide 39

Slide 39 text

Driver ObservableΛUIύʔπʹbind͢ΔͨΊͷػߏObservableΛDriverʹม ׵͢Δ͜ͱͰɺ 
 ɾ[ϝΠϯεϨουͰߪಡ͞ΕΔ]
 ɾ[ΤϥʔΛग़ྗ͠ͳ͍]
 ɾ[ෳ਺ͷViewʹbindͯ͠΋1ͭͷSubscription͚͕ͩੜ੒ɾڞ༗͞Ε Δ(Hotม׵͞ΕΔ)] 
 ͱ͍ͬͨɺViewʹObservableΛద߹͢ΔͨΊʹඞཁͳॲཧΛཪଆͰߦͬ ͯ͘ΕΔɻ

Slide 40

Slide 40 text

SimpleValidationͷઌ΄ͲͷྫΛDriverͰॻ͘ͱ…. ⏬ asDriver()Λ࣮ߦͨ࣌͠఺ͰHotม׵͞ΕΔͷͰɺ͜ͷ৔߹ShareReplay΋ෆཁʹͳΔɻ

Slide 41

Slide 41 text

ViewModel (MVVMύλʔϯ) View ViewModel Model <————> ————> <———— Binding UIϩδοΫɺ΋͘͠͸UI ͦͷ΋ͷͷఆٛɻiOSͷ ৔߹xib΍StoryboardͰ ఆٛ͞ΕͨUI৘ใ/ CustomViewͳͲ͕֘ ౰ɻViewͷঢ়ଶߋ৽͸ DataBindingػߏΛ௨͡ ͯߦΘΕΔɻ ϓϨθϯςʔγϣϯϩδο ΫΛهड़͢ΔɻViewʹද ࣔ͢΂͖஋ΛBindingͰ ͖Δܗ(Observable/ Driver)ʹͯ͠ެ։͢Δɻ ModelͷมߋΛ؂ࢹ͠ɺ ͦΕʹ߹Θͤͨදࣔϩδο ΫΛهड़͢Δɻ υϝΠϯ૚ɻUIͷ͜ͱ͸ ҙࣝ͠ͳ͍ɻσʔλऔಘ ॲཧɺϏδωεϩδοΫɺ σʔλ͕Ϛοϐϯά͞Ε ͨΤϯςΟςΟͳͲ͔Β ੒ΔɻσʔλΛऔಘ͠ɺ Կ͔͠Βૢ࡞ͨ͠ޙɺσʔ λͷू߹ΛแΜͩ ObservableΛެ։͢ ΔɺͳͲɻ

Slide 42

Slide 42 text

GithubSignupViewModel2 Viewʹbinding͢ΔDriver͕ެ։͞Ε͍ͯΔɻ͜ͷViewModelͰ ͸subscribe͸࣮ߦ͠ͳ͍ͷͰDisposeBag͸อ͍࣋ͯ͠ͳ͍ɻ

Slide 43

Slide 43 text

userNameͷvalidate Λ௥ͬͯΈΔ

Slide 44

Slide 44 text

flatMap: ObservableΛฦ͢ͱɺͦͷObservable͕emit͢ΔཁૉΛ γʔέϯεʹྲྀ͢͜ͱ͕Ͱ͖Δɻ PromiseͷthenͷΠϝʔδʹ͍ۙɻඇಉظॲཧΛॱʹهड़͍ͨ͠ͱ͖ ʹඇৗʹศརɻ্هͷྫͰ͸ɺuserNameͷςΩετʹมߋ͕͋ͬͨ ৔߹ɺ࠷ޙʹemit͞ΕͨTextΛݩʹvalidateUserNameͱ͍͏ඇಉظ ॲཧΛ࣮ߦɺͦͷ݁Ռͷ஋Λemit͢ΔγʔέϯεΛੜ੒͍ͯ͠Δɻ

Slide 45

Slide 45 text

validateUsername͸ɺStringΛड͚औͬͯObservableΛฦ͢ϝιο υɻ

Slide 46

Slide 46 text

ValidationResult͸Validateͷ݁ՌΛอ࣋͢ΔEnumܕɻ validateUsername͸ɺStringΛड͚औͬͯObservableΛฦ͢ϝιο υɻͳͷͰɺViewModelͷvalidatedUsernameʹ͸ɺ Observable͕֨ೲ͞ΕΔɻ

Slide 47

Slide 47 text

ੜ੒͞ΕͨvalidationUsernameΛUILabelʹbinding͍ͯ͠Δɻ ex_validationResult͸ɺ͜ͷαϯϓϧͷͨΊʹUILabelΛ֦ுͯ͠࡞Β Εͨؔ਺ɻValidationResultΛUILabelʹbinding͢Δॲཧ͕͜͜ʹ࣮૷ ͞Ε͍ͯΔɻ(textColor, description͸ValidationResultͷEnumʹੜ΍ ͨ͠ϝιου)

Slide 48

Slide 48 text

signinपΓͷ੍ޚ

Slide 49

Slide 49 text

ɹdistinctUntilChanged: ྲྀΕͯདྷͨ஋͕લճͱҟͳΔ΋ͷͩͬͨ ͱ͖ͷΈɺγʔέϯεʹ஋Λྲྀ͢ɻͭ·Γɺೖྗ͕͋ͬͯςΩετ͕ มߋ͞Εͯ΋validate݁Ռ͕લճͷೖྗͱಉͩͬͨ͡৔߹ʹ͸γʔέ ϯεʹ஋Λྲྀ͞ͳ͍ɻ

Slide 50

Slide 50 text

ɹwithLatestFrom: ݩͷObservable(loginTaps)ʹɺࢦఆͨ͠ Obaservableͷγʔέϯεͷ࠷ޙͷཁૉΛ߹੒͢Δɻͭ·Γɺ࠷ޙʹ ೖྗ͞Εͨusernameͱpasswordͷ஋Λ࣋ͬͨObservableʹͳΔɻ

Slide 51

Slide 51 text

ɹtrackActivity: ͜ͷαϯϓϧͷͨΊʹ࡞ΒΕͨϢʔςΟϦςΟɻ usingΦϖϨʔλΛར༻͠ɺͦͷObservable͕Completed͞ΕΔ·Ͱ ͷؒʹɺΠϯδήʔλΛදࣔ͢Δɻ

Slide 52

Slide 52 text

ɹusing: Observableͱಉ͡ੜଘظؒΛ࣋ͭϦιʔεͱObservableΛඥ෇͚Δ ͜ͱ͕Ͱ͖Δɻ͜ΕΛར༻͢Ε͹ɺObservable͕ߪಡ͞Ε͸͡Ίͨͱ͖ͷॲ ཧɺͦͯ͠Observableͷߪಡ͕׬ྃͨ͠ͱ͖ͷॲཧΛ࣮૷͢Δ͜ͱ͕Ͱ͖Δɻ ͜͜Ͱ͸ɺ௨৴Λ࣮ߦ͢ΔObservableͷߪಡ͕։࢝͞ΕͨΒ಺෦ͷΧ΢ϯλΛ ΠϯΫϦϝϯτɺObservableͷߪಡ͕׬ྃͨ͠ΒσΫϦϝϯτ͢Δ࣮૷ͱͳͬ ͍ͯΔɻ Χ΢ϯλ͕1Ҏ্ͷͱ͖ʹΠϯδήʔλ͕දࣔ͞ΕΔɻ

Slide 53

Slide 53 text

Ҏ্ɺRxExampleͷ͝঺հͰͨ͠

Slide 54

Slide 54 text

GitHubSearchRepositoriesɺ WikipediaImageSearchͳͲࠓճ͸঺հ͠ͳ ͔ͬͨ͞Βʹ࣮ફతͳྫ΋͋ΔͷͰɺڵຯ͋Δ ํ͸ͥͻRxExampleΛಡΈࠐΜͰΈΑ͏ʂ