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
RxFeedback使ってみた
Search
yukatou
January 23, 2018
Technology
2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RxFeedback使ってみた
yukatou
January 23, 2018
Other Decks in Technology
See All in Technology
少人数データチームのDevin活用実践事例
runandy16
2
440
bet_ai_day_2026_session02
agenticsec
1
980
AI-DLCって実際どう? 〜聞きたいこと全部聞いてみる〜
news_it_enj
0
220
AI 駆動 Terraform 開発/SRE_BizReach_MIXI_2
visional_engineering_and_design
0
320
KAEN Company Deck
kaen
PRO
0
320
プロダクト思考 × 基盤思考を AIで実現する Compound Engineering
tkc66buzz
1
260
PM領域でのAI Agentの活用
lycorptech_jp
PRO
0
270
どんな手を使っても絶対間に合わせるスケジューラ
asari194617
0
1.6k
Genie Code ワークショップ 応用編 / Genie-Code-Workshop-advanced
databricksjapan
PRO
0
330
Level Up Your CDK DX: 5 Tools I’ve Been Building
gotok365
2
190
Redmine 7.0で私が開発した新機能の狙いと背景
vividtone
1
110
PfEingのアプローチで働こう
rindrics
0
170
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
15k
エンジニアに許された特別な時間の終わり
watany
108
250k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.7k
The SEO Collaboration Effect
kristinabergwall1
1
550
Discover your Explorer Soul
emna__ayadi
2
1.3k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.9k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
430
Prompt Engineering for Job Search
mfonobong
0
440
Transcript
RxFeedbackͬͯΈͨ Nagoya iOS Meetup Vol.1 2018.1 @katoyan_
ࣗݾհ • @katoyan_ • ͓ͱͱ໊͠ݹʹUλʔϯ͖ͯ͠·ͨ͠ • ࣄ iOS, αʔόαΠυ •
࠷ۙԾ௨՟ʹϋϚͬͯ·͢
RxSwiftͬͯ·͔͢ʁ
None
RxSwiftͰ։ൃ͢Δͱ͖ ΞʔΩςΫνϟͬͯԿ͕ྑ͍ΜͩΖ͏ʁ MVVM? Flux/Redux? Clean Architecture?
None
IUUQTHJUIVCDPNCFFUIWFO3Y4XJGU$IJOFTF%PDVNFOUBUJPO
RxFeedback • Try! Swift NYC (2017.11) Modern RxSwift Architectures by
Krunoslav Zaher • https://github.com/NoTests/RxFeedback.swift • ݕࡧͯ͠υΩϡϝϯτগɻɻ
RxFeedbackͷߏ The simplest architecture for RxSwift IUUQTHJUIVCDPN/P5FTUT3Y'FFECBDLTXJGU
͋ΕʁReduxʹࣅͯΔؾ͕͢Δ
IUUQTBDBEFNZSFBMNJPQPTUTUSZTXJGUOZDLSVOPTMBW[BIFSNPEFSOSYTXJGUBSDIJUFDUVSFT 3FEVY"QQMJDBUJPO-FWFMͰͭͷେ͖ͳ4UBUF͕ඞཁɻ 3Y'FFECBDL7JFX$POUSPMMFS୯ҐͰ4UBUFΛ࣋ͭ͜ͱՄೳɻ ൖίετ͕Լ͕Δ
typealias Feedback<State, Event> = (Observable<State>) -> Observable<Event> public static func
system<State, Event>( initialState: State, reduce: @escaping (State, Event) -> State, feedback: Feedback<State, Event>... ) -> Observable<State> w JOJUJBM4UBUFॳظ4UBUFΛࢦఆ w SFEVDF&WFOUΛड͚औͬͯɺ4UBUFΛมߋ͢ΔॲཧΛఆٛ w GFFECBDL4UBUFͷมߋΛͱʹ6*Λมߋͨ͠Γɺ&WFOUΛൃՐͤ͞Δॲ ཧΛఆٛ Observable.systemPSDriver.systemͰݺͼग़͠ Interface
None
RxFeedbackͰΞϓϦΛ࡞ͬͯΈͨ Ծ௨՟"1*ΛϦΫΤετͯ݁͠ՌΛ 6*5BCMF7JFXͰදࣔ SFGSFTI$POUSPMMͰ݁ՌΛϦϑϨογϡ 6*5BCMF7JFXͷҰ൪Լ·ͰεΫϩʔϧͨ͠ Βଓ͖ͷσʔλΛऔಘ
State struct State { // ಡΈࠐΈϖʔδ var loadPage: Int? =
1 // ಡΈࠐΈத͔ var loading: Bool = false // ΞΠςϜϦετ var items: [Coin] = [] }
Event enum Event { // ϦϑϨογϡ case refresh // ࣍ͷϖʔδΛϦΫΤετ
case loadNextPage // Ϩεϙϯε case response([Coin]) }
Reducer reduce: { (state: State, event: Event) -> State in
switch event { case .refresh: var results = state results.loadPage = 1 results.loading = true results.items = [] return results case .loadNextPage: var results = state results.loadPage = (results.items.count / fetchCount) + 1 results.loading = true return results case .response(let items): var results = state results.loadPage = nil results.loading = false results.items += items return results } }
Feedback feedback: bind(self) { me, state in let subscriptions: [Disposable]
= [ // itemsΛUITableViewʹBind state.map { $0.items } .drive(me.tableView.rx.items(cellIdentifier: "Cell"))(me.configureCell), // loading ͕falseͰ͋ΕrefreshControlΛఀࢭ state.map { $0.loading }.filter { !$0 } .drive(onNext: { _ in me.refreshControl.endRefreshing() }) ] let events: [Signal<Event>] = [ // RefreshControl͕มߋ͞ΕΕrefreshΠϕϯτΛൃՐͤ͞Δ me.refreshControl.rx.controlEvent(.valueChanged).asSignal().map { _ in Event.refresh }, // UITableViewΛఈ·ͰεΫϩʔϧͨ͠߹loadNextPageΠϕϯτΛൃՐͤ͞Δ state.flatMapLatest { state in if state.loading { return Signal.empty() } return me.tableView.rx.reachedBottom.map { _ in Event.loadNextPage } } ] return Bindings(subscriptions: subscriptions, events: events) }, react(query: { $0.loadPage }, effects: { page in // loadPage͕มߋ͞ΕΔʹݺΕΔ(nilͷ߹ݺΕͳ͍) return api.fetch(page: page, limit: fetchCount) .asSignal(onErrorJustReturn: []) .map(Event.response) })
DEMO
ͬͯΈͨॴײ • State ͱ Event ͷઃܭ͕େࣄ • ׂ͕໌֬ʹͳͬͯΔ͜ͱͰɺՄಡੑྑ͘ͳͬͨ • RxFeedback
Λ͏લͱൺΔͱهड़ྔݮͬͨ • υΩϡϝϯτʢαϯϓϧʣ͕গͳ͍ͷͰਏ͔ͬͨ
͓ΘΓ https://github.com/yukatou/CryptoChecker-RxFeedback