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
RxSwiftをプロダクトに導入してみた話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kazuhiro Sakamoto
April 14, 2016
Programming
6.3k
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
13k
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
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.2k
iOSDC2026登壇資料.pdf
riofujimon
0
200
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
400
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
330
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
190
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
140
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
120
すこし踏み込む CancellationToken
htkym
2
1.6k
Agents on Rails - Rails at Scale 2026
irinanazarova
0
320
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
170
APNsからLive Activityを開始する話
yumnumm
0
150
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
120
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Designing for Timeless Needs
cassininazir
1
510
Designing for Performance
lara
611
70k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
420
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
710
Into the Great Unknown - MozCon
thekraken
41
2.7k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
620
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
730
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
550
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
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·Ͱ ͓ؾܰʹ͝࿈བྷ͍ͩ͘͞ɻ ڵຯͷ͋Δํ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠