Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
RxExampleから学ぶ!RxSwift
Search
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
13k
Swiftにもasync/awaitがやって来る!
kazu0620
4
1.6k
やさしくわかるMVVM
kazu0620
11
2.9k
RxSwiftをプロダクトに導入してみた話
kazu0620
13
6.3k
Other Decks in Programming
See All in Programming
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
930
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
410
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
3
1.2k
ActionController meets Protocol Buffers
sorah
0
680
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
150
contenteditable と日本語入力に向き合う
colorful12
0
210
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
450
Event is what happens
moro
2
1.4k
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
150
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
370
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
0
790
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
200
Featured
See All Featured
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
500
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
490
Marketing to machines
jonoalderson
1
5.9k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
410
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
ラッコキーワード サービス紹介資料
rakko
4
5.4M
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
30 Presentation Tips
portentint
PRO
1
440
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
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ΛಡΈࠐΜͰΈΑ͏ʂ