Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RxExampleから学ぶ!RxSwift
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kazuhiro Sakamoto
August 19, 2016
Programming
3.4k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RxExampleから学ぶ!RxSwift
8月19日 RxSwift勉強会の発表資料です!
Kazuhiro Sakamoto
August 19, 2016
More Decks by Kazuhiro Sakamoto
See All by Kazuhiro Sakamoto
今こそ理解しよう、輸出コンプライアンス
kazu0620
7
12k
Swiftにもasync/awaitがやって来る!
kazu0620
4
1.6k
やさしくわかるMVVM
kazu0620
11
2.9k
RxSwiftをプロダクトに導入してみた話
kazu0620
13
6.2k
Other Decks in Programming
See All in Programming
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
150
3Dシーンの圧縮
fadis
1
680
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
210
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
230
Spec-Driven Development with AI-Agents: From High-Level Requirements to Working Software
antonarhipov
2
480
TAKTでAI駆動開発の品質を設計する
j5ik2o
6
1.1k
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
240
Contextとはなにか
chiroruxx
0
230
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
260
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.3k
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
120
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
130
Featured
See All Featured
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
200
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
150
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
300
New Earth Scene 8
popppiees
3
2.3k
Deep Space Network (abreviated)
tonyrice
0
170
AI: The stuff that nobody shows you
jnunemaker
PRO
8
700
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
390
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
850
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
600
Visualization
eitanlees
152
17k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
65
55k
Transcript
RxExample͔ΒֶͿʂ RxSwift @kazu0620
ࣗݾհ ࡔຊ େ( @kazu0620 ) Sansanגࣜձࣾ Eightࣄۀ෦ॴଐ աڈʹݸਓͰ։ൃͨ͠ΞϓϦ - ൿີͷΞϧόϜ(40ສDL!)
- ʹΌΜ͜(15ສDL!)
RxExampleͱʁ
RxExample • ެࣜϦϙδτϦʹؚ·ΕͯΔRxSwiftͷ༻ྫ • ඇৗʹγϯϓϧͳྫ͔ΒɺMVVMͰهड़͞Ε ࣮ͨతͳྫ·Ͱɺଟ͘ͷαϯϓϧ͕͋Δɻ • RxSwiftΛͲ͏͑ྑ͍͔ɺͲ͏ͬͯ΄͠ ͍ͱ૾ͯ͠࡞ΒΕ͍ͯΔͷ͔Θ͔Δ
git clone
[email protected]
:ReactiveX/RxSwift.git Ҏ߱ͷ͓ͥͻɺRxExampleͷίʔυ Λݟͳ͕Β͓ฉ͖͍ͩ͘͞ɻ
ͷExamplesҎԼͷσΟϨΫτϦɻ
Numbers
3ͭͷTextFieldʹͦΕͧΕΛೖྗ͢Δͱɺ ϦΞϧλΠϜʹͦͷ߹ܭ͕ग़ྗ͞ΕΔɻ
None
rx_text: TextFieldͷtextʹมߋ͕͋ͬͨ߹ʹͦͷΛemit͢Δɻྫ ͑શͯͷTextFieldʹ1,2,3ͱ͍͏Λॱʹೖྗͨ͠ͱ͖ɺԼهͷ ༷ͳγʔέϯεͱͳΔɻ
combineLatest: ͦΕͧΕͷγʔέϯεͷ࠷ޙʹൃߦͨ͠Λ߹͠ ͯɺ৽͍͠γʔέϯεΛੜ͢ΔɻʮͲͷγʔέϯεΛ߹͢Δ͔ʁʯ ͱʮͲ͏ͬͯ߹͢Δ͔ʁʢΫϩʔδϟʹॻ͘)Λࢦఆ͢Δ͜ͱ͕Ͱ ͖Δɻ + +
map: ετϦʔϜͷཁૉΛม͠ɺ৽ͨͳετϦʔϜΛੜ͢Δɻྻʹର ͯ͠mapΛ࣮ߦ͢Δͷͱಉ͡Α͏ʹߟ͑ΔͱΘ͔Γ͍͢ɻ্هͷmap combineLatest͕ฦ͢ཁૉܕͳͷͰɺͦΕΛdescriptionΛ༻͍ͯString ʹม͍ͯ͠Δɻ
bindTo: ετϦʔϜͷཁૉ͕ྲྀΕͯ͘ΔͷΛߪಡ͠ɺͦͷཁૉΛର (UI෦ͳͲ)ʹඥ͚Δɻͱ͍͏ॲཧΛ؆୯ʹॻ͚Δɻ͘͢͝ஸೡ ʹॻ͘ͱɺԼهͱಉ͜͡ͱΛ͍ͯ͠Δɻ
subscribe: ετϦʔϜʹྲྀΕͯ͘ΔཁૉΛߪಡ͢Δ͜ͱ͕ग़དྷΔɻ ਖ਼ৗʹ͕ྲྀΕ͖ͯͨ߹: .Next Τϥʔ͕ൃੜͨ͠߹: .Error ετϦʔϜ͕ऴྃͨ͠߹: .Completed subscribeNext, subscribeError
ͳͲͰΠϕϯτΛࢦఆͯ͠ߪಡ ͢Δ͜ͱՄೳɻ
addDisposableTo: ߪಡͷഁغΛ͢ΔDisposeBagΛࢦఆ ͢Δɻ͜Ε͕ͳ͍ͱɺετϦʔϜΛӬԕʹߪಡͨ͠··ʹͳͬͯ͠· ͏߹͕͋ΔͷͰҙɻ DisposeBag: bagΛอ࣋͢ΔΠϯελϯε͕dealloc͞ΕͨλΠϛ ϯάͰɺอ࣋͢Δͯ͢ͷߪಡΛղ์͢Δɻͭ·ΓɺNumbersͷྫͰ ݴ͏ͱViewController͕dealloc͞ΕΔλΠϛϯάͰɺετϦʔϜͷߪ ಡͯ͢ऴྃ͢Δɻ
SimpleValidation
UsernameɺPasswordͷTextFieldʹೖྗ͞Εͨจ ࣈʹΑͬͯಈతʹද͕ࣔมԽ͢Δʢ͍ܯࠂจ ࣈ͕ফ͑Δ / Ϙλϯ͕disable͔ΒenableʹͳΔʣ
map(෮श): ετϦʔϜʹྲྀΕͯ͘Δཁૉɺrx_textͳͷͰจࣈ ྻɻͰࠓճɺ࠷ऴతʹ͜ΕΛhidden(BOOL)ͱ͔ enabled(BOOL)ʹɺbind͍ͨ͠ͱ͍͏اըɻͳͷͰɺmapΛར༻͠ ͯཁૉΛString͔Β5จࣈҎ্͔Ͳ͏͔(BOOL)ʹม͍ͯ͠Δɻ
͜͜Ͱઌ΄Ͳ࡞ͬͨusernameValidͱpasswordValidͷετϦʔϜ Λ߹ͯ͠ɺ͍ͣΕTrueͩͬͨͱ͖ͷΈTrueΛྲྀ͢ετϦʔϜΛ৽ ͨʹੜ͍ͯ͠Δɻ combineLatest: ͦΕͧΕͷγʔέϯεͷ࠷ޙʹൃߦͨ͠Λ߹͠ ͯɺ৽͍͠γʔέϯεΛੜ͢ΔɻʮͲͷγʔέϯεΛ߹͢Δ͔ʁʯ ͱʮͲ͏ͬͯ߹͢Δ͔ʁʢΫϩʔδϟʹॻ͘)Λࢦఆ͢Δ͜ͱ͕Ͱ ͖Δɻ
bindTo(෮श): ετϦʔϜͷཁૉΛUIViewͷϓϩύςΟʹඥ͚͍ͯΔɻ addDisposableTo: (෮श): ετϦʔϜͷߪಡऴྃΛཧ͢ΔDisposeBag ʹͦΕͧΕͷߪಡΛొ͍ͯ͠Δɻ
subscribeNext(෮श): ετϦʔϜʹྲྀΕͯ͘ΔΠϕϯτ(ࠓճ UIButtonͷλοϓ)Λߪಡ͠ɺϋϯυϦϯά͢Δɻ
গ͠Λ͢
shareReplay: ετϦʔϜΛHotม͠ɺذ͍ͤͯ͞Δɻ
Observable • γʔέϯεͷܭࢉํ๏/खଓΛఆٛͨ͠ͷɻ ఆ͚ٛͨͩ͠ͳͷͰɺߪಡ(subscribe)͢Δ· Ͱ࣮ߦ͞ΕΔ͜ͱͳ͍ɻٯʹݴ͏ͱɺ subscribe͞Εͨ࣌Ͱఆٛͨ͠ܭࢉ͕࣮ߦ͞ ΕΔɻ
bindTo(෮श): ͍ͬͯΔ͜ͱɺsubscribeͯ͠.NextͰରͷUIViewͷ ϓϩύςΟΛมߋ͍ͯ͠Δͷͱಉ͡ɻ
shareReplay͍ͯ͠ͳ͍ͱ͖
্هͷίʔυಉҰͷObservableΛ2ճߪಡ(subscribe)͍ͯ͠Δɻઌ ΄Ͳઆ໌ͨ͠Α͏ʹɺObservable subscribe͞Εͨ࣌Ͱఆٛͨ͠ܭࢉ͕࣮ߦ͞ΕΔ ͭ·Γ2ճsubscribe͢Δͱɺ2ຊͷετϦʔϜ͕ੜ· Εɺ2ճܭࢉ͕࣮ߦ͞ΕΔ
shareReplay͕ͳ͍߹ɺ͜ͷmap͕2ճ(subscribe͚ͨͩ͠)࣮ߦ͞ Εͯ͠·͏ɻ ͜Ε͘Β͍ͷॲཧͳΒͨ͘͞Μͬͯͳ͍͕ɺ߹ʹΑͬͯ ҙਤͤͣແବͳܭࢉϦιʔεΛͬͯ͠·͏͜ͱʹͳΔɻ
HotͱCold
ShareReplay͍ͯ͠ͳ͍Observable ShareReplayͨ͠Observable ্هͷਤʮRxͷHotͱColdʹ͍ͭͯʯΑΓҾ༻ (http://qiita.com/toRisouP/items/f6088963037bfda658d3)
SimpleTableViewExample
γϯϓϧͳTableViewΛRxSwiftͷbindingػߏΛ ࣮ͬͯݱ͢Δɻ
ྻΛObservableʹแΉɻ͜͜ͰSampleͳͷͰ؆қʹྻΛཁૉ ͱͯ࣋ͬͨ͠ObservableΛੜ͢ΔͨΊ্هͷΑ͏ʹهड़͍ͯ͠Δͩ ͚ɻ ࣮ࡍʹɺAPI௨৴ʹΑͬͯऔಘͨ͠ྻΛཁૉͱͯ࣋ͭ͠ ObservableΛTableViewʹbind͢ΔɺͳͲͷέʔε͕ଟ͍ͣɻ
ྻΛཁૉͱͯ࣋ͬͨ͠ObservableΛtableViewʹbind͍ͯ͠Δɻ͜ Ε͚ͩͰTableViewͷද͕ࣔͰ͖Δɻ CellͷIdentifierͱܕΛҾʹ͠ɺΫϩʔδϟͰCellͷॳظԽॲཧ Λ࣮͢Δ͚ͩɻ row: IndexPath.row element: bind͞ΕͨObservableͷཁૉ(ࠓճจࣈྻ) cell: ੜ͞ΕͨTableViewCell
rx_modelSelected: Cell͕Select͞Εͨ࣌ͷΠϕϯτΛemit͢ΔɻҾ (String)bindͨ͠ཁૉͷܕΛࢦఆ͢Δɻ rx_itemAccessoryButtonTapped: Cellʹஔ͞Ε͍ͯΔ AccessoryButton͕λοϓ͞Εͨ࣌ͷΠϕϯτΛemitɻ
GitHubSignup(Driver൛)
GitHubͷΞΧϯτΛ৽͘͠ొ͢ΔॲཧΛRxSwiftͰ࣮ (ΞΧϯτͷੜ෦MockͳͷͰຊʹΞΧϯτ͕࡞ΒΕΔ͜ͱͳ͍) ɾDriverΛ༻͍ͨUIύʔπͷόΠϯσΟϯάॲཧ ɾViewModelΛ༻͍ͨϓϨθϯςʔγϣϯϩδοΫͷ ɾAPIϦΫΤετΛ࣮ߦ͢Δ௨৴ॲཧ ΈͲ͜Ζ
Driverͱʁ
Driver ObservableΛUIύʔπʹbind͢ΔͨΊͷػߏObservableΛDriverʹม ͢Δ͜ͱͰɺ ɾ[ϝΠϯεϨουͰߪಡ͞ΕΔ] ɾ[ΤϥʔΛग़ྗ͠ͳ͍] ɾ[ෳͷViewʹbindͯ͠1ͭͷSubscription͚͕ͩੜɾڞ༗͞Ε Δ(Hotม͞ΕΔ)] ͱ͍ͬͨɺViewʹObservableΛద߹͢ΔͨΊʹඞཁͳॲཧΛཪଆͰߦͬ
ͯ͘ΕΔɻ
SimpleValidationͷઌ΄ͲͷྫΛDriverͰॻ͘ͱ…. ⏬ asDriver()Λ࣮ߦͨ࣌͠ͰHotม͞ΕΔͷͰɺ͜ͷ߹ShareReplayෆཁʹͳΔɻ
ViewModel (MVVMύλʔϯ) View ViewModel Model <————> ————> <———— Binding UIϩδοΫɺ͘͠UI
ͦͷͷͷఆٛɻiOSͷ ߹xibStoryboardͰ ఆٛ͞ΕͨUIใ/ CustomViewͳͲ͕֘ ɻViewͷঢ়ଶߋ৽ DataBindingػߏΛ௨͡ ͯߦΘΕΔɻ ϓϨθϯςʔγϣϯϩδο ΫΛهड़͢ΔɻViewʹද ͖ࣔ͢ΛBindingͰ ͖Δܗ(Observable/ Driver)ʹͯ͠ެ։͢Δɻ ModelͷมߋΛࢹ͠ɺ ͦΕʹ߹Θͤͨදࣔϩδο ΫΛهड़͢Δɻ υϝΠϯɻUIͷ͜ͱ ҙࣝ͠ͳ͍ɻσʔλऔಘ ॲཧɺϏδωεϩδοΫɺ σʔλ͕Ϛοϐϯά͞Ε ͨΤϯςΟςΟͳͲ͔Β ΔɻσʔλΛऔಘ͠ɺ Կ͔͠Βૢ࡞ͨ͠ޙɺσʔ λͷू߹ΛแΜͩ ObservableΛެ։͢ ΔɺͳͲɻ
GithubSignupViewModel2 Viewʹbinding͢ΔDriver͕ެ։͞Ε͍ͯΔɻ͜ͷViewModelͰ subscribe࣮ߦ͠ͳ͍ͷͰDisposeBagอ͍࣋ͯ͠ͳ͍ɻ
userNameͷvalidate ΛͬͯΈΔ
flatMap: ObservableΛฦ͢ͱɺͦͷObservable͕emit͢ΔཁૉΛ γʔέϯεʹྲྀ͢͜ͱ͕Ͱ͖Δɻ PromiseͷthenͷΠϝʔδʹ͍ۙɻඇಉظॲཧΛॱʹهड़͍ͨ͠ͱ͖ ʹඇৗʹศརɻ্هͷྫͰɺuserNameͷςΩετʹมߋ͕͋ͬͨ ߹ɺ࠷ޙʹemit͞ΕͨTextΛݩʹvalidateUserNameͱ͍͏ඇಉظ ॲཧΛ࣮ߦɺͦͷ݁ՌͷΛemit͢ΔγʔέϯεΛੜ͍ͯ͠Δɻ
validateUsernameɺStringΛड͚औͬͯObservableΛฦ͢ϝιο υɻ
ValidationResultValidateͷ݁ՌΛอ࣋͢ΔEnumܕɻ validateUsernameɺStringΛड͚औͬͯObservableΛฦ͢ϝιο υɻͳͷͰɺViewModelͷvalidatedUsernameʹɺ Observable<ValidationResult>͕֨ೲ͞ΕΔɻ
ੜ͞ΕͨvalidationUsernameΛUILabelʹbinding͍ͯ͠Δɻ ex_validationResultɺ͜ͷαϯϓϧͷͨΊʹUILabelΛ֦ுͯ͠࡞Β ΕͨؔɻValidationResultΛUILabelʹbinding͢Δॲཧ͕͜͜ʹ࣮ ͞Ε͍ͯΔɻ(textColor, descriptionValidationResultͷEnumʹੜ ͨ͠ϝιου)
signinपΓͷ੍ޚ
ɹdistinctUntilChanged: ྲྀΕͯདྷ͕ͨલճͱҟͳΔͷͩͬͨ ͱ͖ͷΈɺγʔέϯεʹΛྲྀ͢ɻͭ·Γɺೖྗ͕͋ͬͯςΩετ͕ มߋ͞Εͯvalidate݁Ռ͕લճͷೖྗͱಉͩͬͨ͡߹ʹγʔέ ϯεʹΛྲྀ͞ͳ͍ɻ
ɹwithLatestFrom: ݩͷObservable(loginTaps)ʹɺࢦఆͨ͠ Obaservableͷγʔέϯεͷ࠷ޙͷཁૉΛ߹͢Δɻͭ·Γɺ࠷ޙʹ ೖྗ͞ΕͨusernameͱpasswordͷΛ࣋ͬͨObservableʹͳΔɻ
ɹtrackActivity: ͜ͷαϯϓϧͷͨΊʹ࡞ΒΕͨϢʔςΟϦςΟɻ usingΦϖϨʔλΛར༻͠ɺͦͷObservable͕Completed͞ΕΔ·Ͱ ͷؒʹɺΠϯδήʔλΛදࣔ͢Δɻ
ɹusing: Observableͱಉ͡ੜଘظؒΛ࣋ͭϦιʔεͱObservableΛඥ͚Δ ͜ͱ͕Ͱ͖Δɻ͜ΕΛར༻͢ΕɺObservable͕ߪಡ͞Ε͡Ίͨͱ͖ͷॲ ཧɺͦͯ͠Observableͷߪಡ͕ྃͨ͠ͱ͖ͷॲཧΛ࣮͢Δ͜ͱ͕Ͱ͖Δɻ ͜͜Ͱɺ௨৴Λ࣮ߦ͢ΔObservableͷߪಡ͕։࢝͞ΕͨΒ෦ͷΧϯλΛ ΠϯΫϦϝϯτɺObservableͷߪಡ͕ྃͨ͠ΒσΫϦϝϯτ͢Δ࣮ͱͳͬ ͍ͯΔɻ Χϯλ͕1Ҏ্ͷͱ͖ʹΠϯδήʔλ͕දࣔ͞ΕΔɻ
Ҏ্ɺRxExampleͷ͝հͰͨ͠
GitHubSearchRepositoriesɺ WikipediaImageSearchͳͲࠓճհ͠ͳ ͔ͬͨ͞Βʹ࣮ફతͳྫ͋ΔͷͰɺڵຯ͋Δ ํͥͻRxExampleΛಡΈࠐΜͰΈΑ͏ʂ