Slide 1

Slide 1 text

Getting Started with ReactiveCocoa v4.1.0 2016/04/13 Reactive Swift Meetup Yasuhiro Inami / @inamiy

Slide 2

Slide 2 text

Reactive Programming

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Streams of Events over time

Slide 5

Slide 5 text

ReactiveCocoa (ObjC/Swift)

Slide 6

Slide 6 text

Signal (Hot Observable) SignalProducer (Cold Observable)

Slide 7

Slide 7 text

‗ and ❄

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

Hot & Cold Observables • Hot Observable ‗ • always active (may lose data if not subscribed) • uses same underlying source (broadcasting) • Cold Observable ❄ • paused until subscription • clones underlying source (not broadcasting)

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

In short...

Slide 12

Slide 12 text

SignalProducer ↯ Signal ↯ Event

Slide 13

Slide 13 text

SignalProducer ↯ Signal ↓ Observer

Slide 14

Slide 14 text

SignalProducer ↯ Signal ↓ɹɹˣ ObserverɹObserver

Slide 15

Slide 15 text

SignalProducer ↯    ↯ SignalɹSignal ↓ɹɹɹɹˣ ObserverɹObserver

Slide 16

Slide 16 text

Function Composition

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

Signal -> Signal SignalProducer -> SignalProducer

Slide 19

Slide 19 text

Signal Operations • Transforming: map, mapError, scan, reduce, ... • Filtering: filter, take, takeUntil, skip, sampleOn, ... • Combining: flatten (Merge/Concat/Latest), combineLatest, zip, flatMap, flatMapError, ... • Timing: delay, throttle, timeoutWithError, ... • Utility: observeOn, materialize, dematerialize, ...

Slide 20

Slide 20 text

SignalProducer Operations • Transforming: map, mapError, scan, reduce, ... • Filtering: filter, take, takeUntil, skip, sampleOn, ... • Combining: flatten (Merge/Concat/Latest), combineLatest, zip, flatMap, flatMapError, ... • Timing: delay, throttle, timeoutWithError, ... • Utility: observeOn, materialize, dematerialize, ... • Producer-Only: startOn, concat, retry, etc...

Slide 21

Slide 21 text

Why do we need 2 different types?

Slide 22

Slide 22 text

Because ‗ and ❄ behaviors differ!

Slide 23

Slide 23 text

Define types based on its behavior (as simple as possible)

Slide 24

Slide 24 text

Signal / SignalProducer • Signal • Container for observers (for broadcasting) • .pipe = pair of (Signal, Observer) = Subject • SignalProducer • Container for startHandler (for cloning) • .buffer = pair of (SignalProducer, Observer) = ReplaySubject

Slide 25

Slide 25 text

Other data types • Observer: Wrapper of Event -> () • Event: .Next, .Failed, .Completed, .Interrupted • Scheduler: GCD / NSThread wrapper • Disposable: Stateful container of () -> () • Property: Latest value + Signal(Producer) • Action: Stateful container of Input -> SignalProducer

Slide 26

Slide 26 text

Compared to other FRPs... • Protocol-oriented, no abstract classes & subclassing • Functional, much less types to learn • Separation of Signal & SignalProducer • No shareReplay, refCount (ConnectableObservable) • Typed errors • combineLatest(o1, o2, ...) ... no mixed error types • property <~ signal ... only NoError is allowed

Slide 27

Slide 27 text

Demo inamiy/ReactiveCocoaCatalog

Slide 28

Slide 28 text

Recap • ReactiveCocoa has separated hot & cold observables • Signal • SignalProducer • Type safe, including generic Error type • Use RAC if you like Result more than Result • RAC is beautiful !✨

Slide 29

Slide 29 text

Thanks!