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
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
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
110
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.4k
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
710
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
950
Android CLI
fornewid
0
190
数百円から始めるRuby電子工作
tarosay
0
110
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
110
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
180
AIが無かった頃の素敵な出会いの話
codmoninc
1
270
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
7k
[RVD26] Vibe Architecture en 2040 : Darwin a-t-il (enfin) eu raison des architectes ?
alexandretouret
0
110
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
41k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
220
How STYLIGHT went responsive
nonsquared
100
6.2k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
530
WCS-LA-2024
lcolladotor
0
760
Product Roadmaps are Hard
iamctodd
55
12k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
350
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
500
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
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ΛಡΈࠐΜͰΈΑ͏ʂ