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
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
250
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
430
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.7k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
290
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
240
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
990
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
340
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
340
The NotImplementedError Problem in Ruby
koic
1
1.1k
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.6k
Featured
See All Featured
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
200
The Invisible Side of Design
smashingmag
301
52k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
440
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
270
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
The Spectacular Lies of Maps
axbom
PRO
1
850
Un-Boring Meetings
codingconduct
0
330
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Fireside Chat
paigeccino
42
4k
How to build a perfect <img>
jonoalderson
1
5.8k
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·Ͱ ͓ؾܰʹ͝࿈བྷ͍ͩ͘͞ɻ ڵຯͷ͋Δํ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠