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
RxSwiftをプロダクトに導入してみた話
Search
Kazuhiro Sakamoto
April 14, 2016
Programming
6.2k
13
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RxSwiftをプロダクトに導入してみた話
4月14日 RxSwift勉強会の発表資料です!
Kazuhiro Sakamoto
April 14, 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
RxExampleから学ぶ!RxSwift
kazu0620
8
3.4k
Other Decks in Programming
See All in Programming
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
120
Lessons from Spec-Driven Development
simas
PRO
0
180
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
3.7k
Webフレームワークの ベンチマークについて
yusukebe
0
160
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
190
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
140
Claspは野良GASの夢をみるか
takter00
0
190
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
330
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
120
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
5.3k
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
890
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
2k
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
A Tale of Four Properties
chriscoyier
163
24k
Everyday Curiosity
cassininazir
0
230
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
22k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
310
Test your architecture with Archunit
thirion
1
2.3k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Utilizing Notion as your number one productivity tool
mfonobong
4
320
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Transcript
RxSwiftΛϓϩμΫτ ʹಋೖͯ͠Έͨ @kazu0620
ࣗݾհ ࡔຊ େ( @kazu0620 ) Sansanגࣜձࣾ Eightࣄۀ෦ॴଐ աڈʹݸਓͰ։ൃͨ͠ΞϓϦ - ൿີͷΞϧόϜ(40ສDL!)
- ʹΌΜ͜(15ສDL!)
agenda • iOSΞϓϦ Eightͷ͝հ • ͳͥRxSwiftͳͷ͔ • RxSwiftͰϋϚͬͨ͜ͱTOP 3 •
RxSiwftΛ༻͍ͨΞϓϦͷઃܭʹ͍ͭͯ
$PQZSJHIU4BOTBO *OD"MMSJHIUTSFTFSWFE
$PQZSJHIU4BOTBO *OD"MMSJHIUTSFTFSWFE
None
ΦϯϥΠϯ໊ަػೳ • NearbyAPIΛར༻ͯۙ͠ྡͷϢʔβʔͱΞϓ Ϧ্Ͱ໊ަΛ࣮ݱ͢Δ • ϦΞϧλΠϜʹঢ়ଶ͕มΘΓଓ͚ΔͨΊɺঢ় ଶཧඇৗʹෳࡶ • Model͔ΒPresentation·ͰRxSwiftΛར ༻࣮ͯͨ͠͠
ͳͥRxSwiftͳͷ͔ʁ
ͳͥRxSwiftͳͷ͔ʁ • એݴతʹهड़Ͱ͖Δ • Rx࣮ރΕٕͨज़Ͱ͋Δ • Rx+αͰඋΘ͍ͬͯΔػೳ܈͕ૉΒ͍͠
ͳͥRxSwiftͳͷ͔ʁ • એݴతʹهड़Ͱ͖Δ • Rx࣮ރΕٕͨज़Ͱ͋Δ • Rx+αͰඋΘ͍ͬͯΔػೳ܈͕ૉΒ͍͠
“ϓϩάϥϛϯάͷඞཁ͋Γ·ͤΜɻϓϩ άϥϜ͕Ͳ͏ಈ͖͔͘Λఆٛͯ͠ɼதؒ ঢ়ଶ༧֎ͷঢ়گͷରॲίϯϐϡʔ λʹͤΕ͍͍ͷͰ͢ɻ” By Krunoslav Zaher
“ඒ͍͠ͱ͍͏ͷɺRxͻͱͭͷจͰઆ໌ Ͱ͖Δ͔ΒͰ͢ɻObservable<T>͕ཁૉT ͷobservableγʔέϯεΛදݱ͍ͯͯ͠ɼ ͦͷsubscribeϝιουΛίʔϧ͢Δ͜ͱ ͰɼγʔέϯεͷཁૉΛड͚औΔࣗͷΦ ϒβʔόΛొ͢Δ͜ͱ͕Ͱ͖·͢” By Krunoslav Zaher
None
ྫ͑ɺ 3ඵؒʹ1ճɺ όοΫάϥϯυεϨουͰɺ αʔόʔͱ௨৴ͯ͠ϢʔβʔͷListใΛऔಘ͠ɺ ৽͍͠Ϣʔβʔͷใ͕Listʹ֨ೲ͞Ε͍ͯͨͱ͖ͷΈɺ ϢʔβʔͷεςʔλεΛνΣοΫ݅͠Λຬ͍ͨͯ͠Εɺ ͦͷϢʔβʔͷৄࡉใΛ͞ΒʹAPI͔Βऔಘ͠ɺ UIʹද͍ࣔͨ͠ʂ
• ͜Ε͔Βى͖ಘΔग़དྷࣄͷγʔέϯεͱɺͦͷܭࢉํ๏Λఆ͍ٛͯ͠Δɻ • ͜ͷ࣌Ͱʮఆٛʯ͚ͨͩ͠(࣮ࡍͷॲཧ͕Δͷߪಡ<Subscirbe>͞ΕͨλΠϛϯά) • ෳࡶͳॲཧ͕ͩɺϝϯόมΛར༻ͨ͠Γঢ়ଶΛอ࣋ͨ͠Γɺͱ͍͏͜ͱҰඞཁ͕ͳ͍
γʔέϯεʹର͢Δૢ࡞ • ObservableγʔέϯεͰ͋Δ • γʔέϯεͳͷͰɺArrayͱಉ༷͡ʹແʹ͋Δ ΦϖϨʔλʔΛͬͯૢ࡞͢Δ͜ͱ͕ग़དྷΔ (map, flatMap, filter, take,
distinct…) • γʔέϯεͷܭࢉํ๏ΛࣗͰఆٛ(৽͍͠Φϖ ϨʔλΛՃ͢Δ)͢Δ͜ͱ؆୯ʹग़དྷΔ
ͳͥRxSwiftͳͷ͔ʁ • એݴతʹهड़Ͱ͖Δ • Rx࣮ރΕٕͨज़Ͱ͋Δ • Rx+αͰඋΘ͍ͬͯΔػೳ܈͕ૉΒ͍͠
ͳͥRxSwiftͳͷ͔ʁ • એݴతʹهड़Ͱ͖Δ • Rx࣮ރΕٕͨज़Ͱ͋Δ • Rx+αͰඋΘ͍ͬͯΔػೳ܈͕ૉΒ͍͠
͏Θͬ… RxSwiftͷݟগͳ͗͢…?
None
Reactive Extensionsͷྺ࢙ • 200911݄ ϚΠΫϩιϑτ͕.Net Framework ্ͷϥΠϒϥϦͱ࣮ͯ͠ݧతʹެ։ • 201111݄ ਖ਼ࣜͳͱͯ͠ঢ֨ɺ.NET
C# ͷੈքͰར༻͞Ε࢝ΊΔ • ͦͷޙɺRxJS, RxJavaͱଞͷݴޠʹҠ২͞Ε ࢝ΊΔ
None
Rxશମͷੵ͞ΕͨݟΛ͑Δ • Observable, Subscribe, Subjectͷجຊతͳ֓೦શͯڞ௨ • ΦϖϨʔλʔͷ໊લɾ༻๏(΄΅)ଞͷRxγϦʔζͱಉ͡ • Θ͔Βͳ͍ݴ༿͕͋ͬͨͱ͖ɺଞͷݴޠͷใΛάάΔͱେྔͷݟΛ ಘΒΕΔ
(ex: [Rx hotม] [RxJS Subject][RxJava xxxx]ͳͲ) • લͷC#ͷهࣄͱ͔ʹॿ͚ΒΕΔ͜ͱଟʑ͋Γ • Eightͷ߹andorid͕RxJavaΛઌߦಋೖ͓ͯ͠Γɺͦ͜Ͱͷݟ ϑΟʔυόοΫͯ͠Β͏͜ͱ͕ग़དྷͨ
ͳͥRxSwiftͳͷ͔ʁ • એݴతʹهड़Ͱ͖Δ • Rx࣮ރΕٕͨज़Ͱ͋Δ • Rx+αͰඋΘ͍ͬͯΔػೳ܈͕ૉΒ͍͠
ͳͥRxSwiftͳͷ͔ʁ • એݴతʹهड़Ͱ͖Δ • Rx࣮ރΕٕͨज़Ͱ͋Δ • Rx+αͰඋΘ͍ͬͯΔػೳ܈͕ૉΒ͍͠
RxSwiftಠࣗͷ֦ு • RxCococa UIKitͷΫϥεͷ֤ϓϩύςΟɾΠϕϯτΛRxͰར༻Ͱ͖ΔΑ͏ʹ Wrapͯ͘͠Ε͍ͯΔɻ͜Εͷ͓ӄͰUIViewͷঢ়ଶมԽΠϕϯτΛ ಠ࣮ࣗ͢Δ͜ͱͳ͘؆୯ʹbindingͰ͖Δɻ • Driver ObservableΛUIύʔπʹbind͢ΔͨΊͷػߏɻObservableΛDriverʹม͢Δ͜ͱͰɺ [ϝΠϯεϨουͰߪಡ͞ΕΔ]
[ΤϥʔΛग़ྗ͠ͳ͍] [ෳͷViewʹbindͯ͠1ͭͷSubscription͚͕ͩੜɾڞ༗͞ΕΔ(Hotม͞ΕΔ)] ͱ͍ͬͨɺViewʹObservableΛద߹͢ΔͨΊʹඞཁͳॲཧΛཪଆͰߦͬͯ͘ΕΔɻ • Variable Subject(BehaviorSubject)ͷWrapperɻSubjectͱҧͬͯɺऴྃͨ͠ΓΤϥʔΛग़ྗ͢Δɺͱ͍͏ ͜ͱ͕ͳ͍ɻྫ͑ViewModelʹΛอ࣋ͯ͠ɺͦͷมԽΛObserve͍ͨ͠ͱ͖ͳͲඇৗʹศ རɻ
RxSwiftಠࣗͷ֦ு RxCocoaͷbindingػߏɺDriverͷ֓೦ɺVariableͷ֓೦ͳͲʹ͍ͭ ͯɺଞͷݴޠͷReactive Extensionsͷݟ͕ಘΒΕͳ͍ͷͰ ҙɻRxSwiftͷDocumentΛಡΉɺఆٛՕॴͷίϝϯτΛݟΔͳͲ͠ ͨํ͕Θ͔Γ͍͢ɻ ͨͩɺRx্ͷ֓೦ʹରͯ͠Ͳ͏͍͏ૢ࡞Λͨ͠ΓWrap͢Δ͔ௐΔ ͨΊʹଞͷݴޠͷݟΛੜ͔͢͜ͱͰ͖Δɻ ྫ͑ɺVariableBehaviorSubjectΛWrapͯ͠Δ͕ɺ
BehaviorSubjectͷڍಈଞͷݴޠͷRx࣮ͱมΘΒͳ͍ɻ
ͱ͍͑ɺ RxSwiftͰϋϚͬͨͱ͜TOP 3
ୈ1Ґ ԿΛͲ͏ֶश͢Εྑ͍͔Θ͔Βͳ͍ ʲ༁ʳ͋ͳ͕ͨٻΊ͍ͯͨϦΞΫςΟϒϓϩάϥϛϯάೖ http://ninjinkun.hatenablog.com/entry/introrxja SwiftͰωΠςΟϒͳϦΞΫςΟϒؔܕϓϩάϥϛϯάΛ࣮ݱ͢ΔRxSwift http://www.infoq.com/jp/news/2016/04/rxswift-reactive-swift RxJS Advent
Calendar http://qiita.com/advent-calendar/2015/rxjs RxSwift Getting Started https://github.com/ReactiveX/RxSwift/blob/master/Documentation/GettingStarted.md RxSwiftϦϙδτϦ(αϯϓϧΛͻͨ͢ΒಡΉͱྑ͍) https://github.com/ReactiveX/RxSwift Observable? Sbscribe? Hot? ͱݴΘΕͯ?????? …ͦΜͳ࣌ʹಡΜͰྑ͔ͬͨྑࢿྉू
ୈ3Ґ SubscribeOn Subscribe͢Δ࣌ͷεϨουΛࢦఆ͢Δͷ͔ͱࢥ͏τϥοϓɻ࣮ɺιʔε (ى)ͱͳOservableͷ࣮ߦεϨουΛࢦఆ͢ΔɻSubscribe͢ΔεϨουΛ ࢦఆ͚ͨ͠ΕɺSubscribe͢ΔલʹObserveOn͢Δɻ ୈ2Ґ Hotม RxͷHotͱColdʹ͍ͭͯ http://qiita.com/toRisouP/items/f6088963037bfda658d3
Rxೖ (13) - HotͱCold http://blog.xin9le.net/entry/2012/01/18/105003 [RxSwift] shareReplayΛͪΌΜͱॻ͍͓ͯߦّྑ͘ετϦʔϜΛߪಡ͠Α͏ http://qiita.com/kazu0620/items/bde4a65e82a10bd33f88 RxͷղઆΛಡΜͰΔͱසൟʹݱΕΔ͕ɺ࠷ॳͦͷ֓೦͕Θ͔Γʹ͘͘ཧղ ʹۤ࿑ͨ͠ɻͷͰɺࢀߟʹͳͬͨࢿྉΛ·ͱΊɻ
RxΛ༻͍ͨઃܭʹ͍ͭͯ RxͱClean Architecture
ଆͷ֊ɺ֎ଆͷ֊ʹ͍ͭͯؔ৺Λ࣋ͨͳ͍ ྫ͑: EntityUsecase, Presentersionͷ࣮ʹґଘ͠ͳ͍ UsecasePresentersionͷ࣮ʹґଘ͠ͳ͍ ֊͝ͱͷɾґଘؔΛ໌֬ʹ͚Δ͜ͱͰɺ อक͍͢͠TestableͳίʔυΛॻ͘͜ͱ͕ग़དྷ Δɻ
Clean Architecture
Clean Architecture • Presentation Layer ϏδωεϩδοΫΛ࣮ͨ͠usecaseΛར༻͠ɺͦͷίʔϧόοΫͰมߋΛViewʹඳը͢Δ • Domain Layer ϏδωεϩδοΫΛUsecaseͱ࣮ͯ͢͠ΔɻUsecaseUI֎ଆͷϑϨʔϜϫʔΫʹ͍ͭͯؔ৺Λ࣋ͭඞཁ
ͳ͍ɻ·ͨUsecaseʹΑͬͯEntityΛɺViewͰར༻͢ΔͨΊͷModelʹม͢Δ࡞ۀߦ͏ɻ • Data Layer Repository PatternΛར༻ͯ͠ɺσʔλιʔεΛநԽ͢Δɻ֎ͷLayer͔ΒɺͲ͜ʹσʔλ͕อଘ͞ΕͯΔ͔ ҙࣝͤͣѻ͏͜ͱ͕ग़དྷΔɻྫ͑Ωϟογϡ͕͋ΕͦΕΛར༻͢Δɺͳ͚ΕAPI͔ΒσʔλΛҾ͘ɺͱ ͍ͬͨૢ࡞ΛFactoryΛ༻͍ͯநԽ͢ΔɺͳͲɻ
͜ΕΛRxͷੈքʹద༻͢Δͱʁ
https://github.com/android10/Android- CleanArchitecture Android ͰɺRxΛClean Architecture ʹద༻͠ ͨૉΒ͍͠ݟ͕͋Δ
None
None
Presentation Layer • ViewControllerɺը໘ͷϥΠϑαΠΫϧɾભҠΛཧ͢Δͷͱͯ͠ͷΈѻ͏ɻ • Presentation LogicXXXPresenterʹ࣮͢Δɻ (Ex. UserListPresenter) •
Presenter = Subscriber PresenterViewΛอ࣋͠ɺUsecase͕ੜͨ͠ϏδωεϩδοΫ(Observable)Λ ߪಡ / Viewʹbind͢Δ • ObservableΛߪಡ/bind͍ͯ͠Εɺࣗಈతʹঢ়ଶͷมԽ͕ө͞ΕΔͷͰϩδο Ϋඇৗʹബ͘ͳΔ • વϏδωεϩδοΫ͕͜ͷʹهड़͞ΕΔ͜ͱͳ͍
None
Domain Layer • Usecaseͱͯ͜͜͠ʹϏδωεϩδοΫΛهड़͢Δ (Ex: GetUserListUsecase) • Repository͔ΒObservableʹแ·ΕͨEntity͕ ͬͯ͘Δ(Ex: Observable<UserList>)
• EntityͷObservableΛϏδωεϧʔϧʹԠͯ͡ ༷ʑͳΦϖϨʔλΛར༻ͯ͠Transform͢Δ
None
Data Layer • σʔλͷऔಘํ๏(API͔Β/Ωϟογϡ͔Β)ΛFactoryͰநԽ͠ɺඞཁ ͳDetaStoreΛRepositry͕ݺͼग़͢͜ͱʹΑΓಁաతʹѻ͑ΔΑ͏ʹ͢Δ • σʔλͷऔಘϩδοΫObservable<T>Ͱ͞ΕΔ • ྫ͑UserDataRepositoryɺ UserDataStoreFactoryʹঢ়گʹԠͯ͡ඞཁͳDataStore
(CloudUserDataStore/DiscUserDataStore)Λੜͯ͠Β͍ɺ ੜ͞ΕͨStore͔ΒObservable<UserData>Λऔಘ͢Δ
EightͰͷઃܭ • ؙ͝ͱ͜ͷઃܭΛऔΓೖΕͯΔΘ͚Ͱͳ͍ɻඞཁʹԠͯ͡֊Λઃܭɻ • ྫ໊͑ަػೳͰɺΫϥΠΞϯτʹσʔλΛӬଓԽͨ͠ΓΩϟογϡͨ͠Γɺ ͱ͍ͬͨૢ࡞ඞཁͳ͔ͬͨͷͰɺPresenterͱඞཁͳϏδωεϩδοΫʹԠͨ͡ Usecaseʹ͚͍ͯΔ Usecase: EntityΛऔಘՃ͢ΔObservableΛੜ
Presenter: Usecase͕ੜͨ͠ObservableΛSuscribe͠ɺ ͖ͬͯͨEntityΛViewModel(DriverVariableΛpropertyͱͯ࣋ͭ͠)ʹม Viewʹbind͢Δɺͱ͍͏Α͏ͳྲྀΕɻ
RxSwiftΛ ϓϩμΫτʹಋೖͨ͠ײͳͲ
• ֶशίετΓߴ͍ɻ͍ํͱ͍͏ΑΓɺ֓೦తͳͷΛཧղ͢Δͷʹίε τ͕͔͔Δɻ • ίετߴ͍͕ेϖΠ͢Δ(ͱࢥͬͯΔ)ɻঢ়ଶΛγʔέϯεͱͯ͠એݴతʹॻ͚ Δ͜ͱɺͦΕʹରͯ͠Ғ͍ਓ͕ͨͪ࡞ͬͨΦϖϨʔλΛ༻͍ͯૢ࡞͕Ͱ͖Δͷ ඇৗʹศརʢ͜͏͍͏ͷ͋ͬͨΒศརͩͳɺͬͯͷେମطʹ͋Δʣɻͺͬͱݟ ໘ͩͳɺͱ͍͏ॲཧ͕1ߦͱ͔2ߦͰॻ͚Δ͜ͱɻ • (RxʹݶͬͨͰͳ͍͕)σʔλόΠϯσΟϯάUI࣮͕ڪΖָ͘͠ʹͳΔɻ
UIͷϩδοΫࣗମബ͘ͳΔͷͰɺঢ়ଶʹؔ͢Δ༷ͷมߋ͕͋ͬͨ߹Model ͚ͩΛमਖ਼͢ΕΑ͘ɺPresentationԿมߋ͢Δඞཁ͕ͳ͍ɻ • ଞͷݴޠͰRxΛ৮Δͱ͖ʹɺֶΜͩࣝΛͦͷ··͑Δͱ͍͏ͷେ͖͍ɻ Androidͷ࣮ͷϓϧϦΫΤετΛݟͯɺԿΛ͍ͯ͠Δ͔ཧղͰ͖ͨΓɺRxʹͭ ͍ͯվΊͯൃݟग़དྷͨΓ͢Δɻ։ൃݴޠOSͷนΛ͑ͨීวతͳࣝͱֶͯ͠ ͿՁ͕͋Δɻ • RxΛֶͿ͜ͱࣗମͬͺΓ৽Ͱָ͍͠ɻ
$PQZSJHIU4BOTBO *OD"MMSJHIUTSFTFSWFE 4BOTBOҰॹʹ৽͍͠ՁΛ࡞͍ͬͯ͘ ؒΛ͕͍ͯ͞͠·͢ɻ 3VCZ 3VCZPO3BJMT ʢ8FCΞϓϦέʔγϣϯʣ $ɼ"41/&5.7$ ʢ8FCΞϓϦέʔγϣϯʣ
J04"OESPJEΞϓϦ ݸਓ໊͚ཧΞϓϦʮ&JHIUʯ ໊σʔλԽࢄॲཧγεςϜ ๏ਓ໊͚ཧαʔϏεʮ4BOTBOʯ ๏ਓ໊͚ཧαʔϏε ʮ4BOTBOʯ ݸਓ໊͚ཧΞϓϦʮ&JHIUʯ ΤϯδχΞืूத 4BOTBO࠾༻ ݕࡧ SFDSVJU!TBOTBODPN·Ͱ ͓ؾܰʹ͝࿈བྷ͍ͩ͘͞ɻ ڵຯͷ͋Δํ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠