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
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
GoのInterface内部構造から学ぶ!最高パフォーマンスを出すコード設計
yappli_developers
1
220
エージェントはローカル、検証はMicroVM — Lambda MicroVMsでつくるServerless CI
fujioka6789
3
610
AIエージェントを最高のパートナーに育てる方法|評価と判断軸を育てる5つのステップ
koichiaoki
1
160
サーバーレスをどこまで使う? WebRTC対戦ゲームで選んだVPSとの共存設計
kaidouji85
0
270
データ界隈LT祭 第1回LT登壇
taromatsui_cccmkhd
2
1.5k
AIに任せた品質は、誰が見立てるのか - AI時代のテストマネジメント
nakanao
3
2.6k
Genieを崇めよ
kameitomohiro
0
170
What the customer really needed
kawaguti
PRO
3
220
AI coding 整合正規方法
philipz
0
420
AIで社員の自主発信に広報目線を組み込む
_mossann_t
0
140
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
4
690
AI de Idea
kawaguti
PRO
2
130
Featured
See All Featured
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
Optimizing for Happiness
mojombo
378
71k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Un-Boring Meetings
codingconduct
0
420
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
730
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
240
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