Slide 1

Slide 1 text

RxSwift Operator ਤؑ yidev ୈ̎̓ճษڧձ Apr 15, 2017 Thu. Toshihiro Suzuki © Toshihiro Suzuki 2017 1

Slide 2

Slide 2 text

ࣗݾ঺հ ☞ @toshi0383 ☞ LGTM, TVMLKitchen, Async ... ☞ ࢓ࣄͰ͸ಈը഑৴ܥͷiOS/tvOSΞϓϦ © Toshihiro Suzuki 2017 2

Slide 3

Slide 3 text

yidev yidev #22 2016/03/05 "Being a tvOS developer" https://speakerdeck.com/toshi0383/being-a-tvos-developer © Toshihiro Suzuki 2017 3

Slide 4

Slide 4 text

3݄ʹೖࣾ͠·ͨ͠ ☞ ը໘΋ͪΐͪ͜ΐ͜৮ΓͭͭɺओʹࣗಈԽ୲౰. ☞ CocoaPods => Carthage ☞ JenkinsΛ୤͍ͨ͠ © Toshihiro Suzuki 2017 4

Slide 5

Slide 5 text

࿩͢͜ͱ ☞ ࢓ࣄ΍WebͰग़ձͬͨRxSwiftͷ৭ʑͳॻ͖ํʹ͍ͭͯɺ৭ʑௐ ΂ͯΈͨ͜ͱΛΏΔ͘ڞ༗͠·͢. ☞ ౰ํ͸ͦ͜·Ͱৄ͍͠Θ͚Ͱ΋ͳ͍Ͱ͢. RxSwiftྺ͸2೥໨͘Β ͍. ☞ ࣗ෼͸͜͏͍͏෩ʹ࢖͍ͬͯΔͱ͍͏ࣄྫͱ͔ɺൃද಺༰Ͱؒ ҧ͍ͬͯΔ͜ͱͱ͔͋ͬͨΒͥͻڭ͍͑ͯͩ͘͞! © Toshihiro Suzuki 2017 5

Slide 6

Slide 6 text

͓͠ͳ͕͖ ☞ share() vs shareReplay() vs shareReplayLatestWhileConnected() ☞ combineLatest vs withLatestFrom ☞ .of() vs .just() / .empty() vs .never() ☞ Observable vs Variable vs Driver vs Subject vs ... ☞ do(onNext:) vs bindNext() vs bindTo() vs subscribe(onNext:) ☞ Where to switch to MainThread ? © Toshihiro Suzuki 2017 6

Slide 7

Slide 7 text

share() vs shareReplay() vs shareReplayLatestWhileConnect ed() ☞ share() ... .publish().refCount() ☞ shareReplay(n) ... share() + replay(n) ☞ shareReplayLatestWhileConnected() ... shareReplay(1)ͱ΄΅Ұ ॹ Ref: https://www.slideshare.net/yukitakahashi3139241/hot-cold © Toshihiro Suzuki 2017 7

Slide 8

Slide 8 text

Demo © Toshihiro Suzuki 2017 8

Slide 9

Slide 9 text

combineLatest vs withLatestFrom ☞ combineLatest ͸fst snd ྆ํ͕τϦΨʹͳΔ (྆ํ_latest஋ΛΩϟογϡ) ☞ withLatestFrom ͸fst ͚͕ͩτϦΨʹͳΔ (ͦͷ෼fstͷΩϟογϡ͕ෆཁ) ☞ withLatestFrom ͰࡁΉͷͰ͋Ε͹ɺcombineLatestΑΓcheap © Toshihiro Suzuki 2017 9

Slide 10

Slide 10 text

.of() vs .just() / .empty() vs .never() ☞ flatMapͷதͰ͸ .just() ? ☞ ฒ΂͍ͨͱ͖͸ .of() ? Observable .of(tap, isReachable.filter { $0 == true }.map(void)) .merge() .flatMap { () -> Observable in guard let req = Api.createRequest() else { return .empty() // .never() Ͱ΋ಈ͘(ΑͶʁ) } return .just(req) // .of(req) Ͱ΋ಈ͘ } © Toshihiro Suzuki 2017 10

Slide 11

Slide 11 text

Observable vs Variable vs Driver vs Subject vs ... class ViewModel { let label = Driver.never() let label = Variable("") let label = PublishSubject() let label: Observable } © Toshihiro Suzuki 2017 11

Slide 12

Slide 12 text

do(onNext:) vs bindNext() vs bindTo() vs subscribe(onNext:) viewModel.rx.label.observeOn(MainScheduler.instance) .do(onNext: { [weak self] text in self?.imageView.isHidden = true }) .bindTo(label.rx.text) // ΤϥʔདྷͯͨΒfatalError (DEBUG) .addDisposableTo(rx_disposeBag) © Toshihiro Suzuki 2017 12

Slide 13

Slide 13 text

do(onNext:) vs bindNext() vs bindTo() vs subscribe(onNext:) viewModel.rx.label.observeOn(MainScheduler.instance) .do(onNext: { [weak self] text in self?.imageView.isHidden = true }) .subscribe(onNext: { [weak self] text in // Τϥʔདྷͯͨͱͯ͠΋ແࢹ self?.label.text = text self?.label.isHidden = false }) .addDisposableTo(rx_disposeBag) © Toshihiro Suzuki 2017 13

Slide 14

Slide 14 text

do(onNext:) vs bindNext() vs bindTo() vs subscribe(onNext:) viewModel.rx.label.observeOn(MainScheduler.instance) .do(onNext: { [weak self] text in self?.imageView.isHidden = true }) .bindNext { [weak self] text in // ΤϥʔདྷͯͨΒfatalError (DEBUG) self?.label.text = text self?.label.isHidden = false } .addDisposableTo(rx_disposeBag) © Toshihiro Suzuki 2017 14

Slide 15

Slide 15 text

Where to switch to MainThread ? ☞ ViewModel૬౰? View? override func viewDidLoad() { super.viewDidLoad() viewModel.rx.label // ͜ͷlabel͸ϝΠϯεϨου͔ʁʁ // UIBindingObserver͸಺෦తʹmainʹ౤͛௚ͯ͘͠ΕΔ͔Β·͍͍͔͋ɻɻ .bindTo(label.rx.text) .addDisposableTo(rx_disposeBag) } © Toshihiro Suzuki 2017 15

Slide 16

Slide 16 text

Where to switch to MainThread ? ☞ ViewModel૬౰? View? ☞ ViewͰ΍Δํ͕໌ࣔతͰΘ͔Γ΍͍͢ͱ͍͏ҙݟ΋ override func viewDidLoad() { super.viewDidLoad() viewModel.rx.label .observeOn(MainScheduler.instance) // ͋ɺΦʔέʔΦʔέʔ .bindTo(label.rx.text) .addDisposableTo(rx_disposeBag) } © Toshihiro Suzuki 2017 16

Slide 17

Slide 17 text

·ͱΊ ☞ ಉ͡ॲཧͰ΋৭ʑͳॻ͖ํ͕Ͱ͖Δ ☞ ࣅ͍ͯΔΑ͏Ͱ΋಺෦ॲཧ͕ҟͳͬͨΓ͢Δ ☞ ͪΐͬͱͣͭཧղΛਂΊͯศརʹ࢖͍͖ͬͯ·͠ΐ͏! © Toshihiro Suzuki 2017 17