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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
140
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
7.2k
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.6k
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
16
8.3k
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
330
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
220
dRuby over BLE
makicamel
2
400
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
1k
1B+ /day規模のログを管理する技術
broadleaf
0
120
Oxlintのカスタムルールの現況
syumai
6
1.2k
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
630
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
620
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1370
210k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
340
Speed Design
sergeychernyshev
33
1.9k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
30 Presentation Tips
portentint
PRO
1
340
AI: The stuff that nobody shows you
jnunemaker
PRO
8
760
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
270
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
ラッコキーワード サービス紹介資料
rakko
1
3.8M
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
400
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
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ΛಡΈࠐΜͰΈΑ͏ʂ