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.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
今さら聞けない .NET CLI
htkym
0
200
バグを直したら useEffect が消えた
colorful12
3
660
「人を評価する AI」の設計と実装
ryoyanara
0
220
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
340
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
360
プロポーザルを書いてもらう
pvcresin
0
560
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
130
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
250
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
210
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
170
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
220
「つくるAI」だけではバグは見つからない ~テストに必要な「見つけるAI」を分離させる戦略~
mfunaki
0
120
Featured
See All Featured
A Soul's Torment
seathinner
6
3.5k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
Darren the Foodie - Storyboard
khoart
PRO
3
3.7k
Evolving SEO for Evolving Search Engines
ryanjones
0
260
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
430
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
Marketing to machines
jonoalderson
1
5.7k
We Are The Robots
honzajavorek
0
300
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
420
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
390
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·Ͱ ͓ؾܰʹ͝࿈བྷ͍ͩ͘͞ɻ ڵຯͷ͋Δํ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠