36
Introduction to Functional Reactive Programming EliaszSawicki.com ( @EliSawic )

iOSCon

Embed Size (px)

Citation preview

Page 1: iOSCon

Introduction to Functional Reactive

Programming

EliaszSawicki.com ( @EliSawic )

Page 2: iOSCon

Functional Reactive Programming

EliaszSawicki.com ( @EliSawic )

Page 3: iOSCon

Streams

EliaszSawicki.com ( @EliSawic )

Page 4: iOSCon

Stream

EliaszSawicki.com ( @EliSawic )

Page 5: iOSCon

Arrayslet values = [1, 2, 3, 4]let doubledValues = values.map { $0 * 2 }let higherThanTwo = values.filter { $0 > 2 }let sum = values.reduce(0, +)

EliaszSawicki.com ( @EliSawic )

Page 6: iOSCon

Filter

EliaszSawicki.com ( @EliSawic )

Page 7: iOSCon

Combine Latest

EliaszSawicki.com ( @EliSawic )

Page 8: iOSCon

Chaining manipulations let names = nameField.reactive.text

EliaszSawicki.com ( @EliSawic )

Page 9: iOSCon

Chaining manipulations names.filter { $0.characters.count >= 3}

EliaszSawicki.com ( @EliSawic )

Page 10: iOSCon

Chaining manipulations names.filter { $0.characters.count >= 3} .map { return "Dear" + $0 }

EliaszSawicki.com ( @EliSawic )

Page 11: iOSCon

Chaining manipulations let prefixedNames = names.filter { $0.characters.count >= 3} .map { return "Dear" + $0 }

let combined = combineLatest(prefixedNames, surnames)

combined.observeValues { prefixedNames, surname in print("Form input is \(prefixedNames) \(surname)") }

EliaszSawicki.com ( @EliSawic )

Page 12: iOSCon

www.rxmarbles.com

EliaszSawicki.com ( @EliSawic )

Page 13: iOSCon

ReactiveSwift

EliaszSawicki.com ( @EliSawic )

Page 14: iOSCon

Events flow

EliaszSawicki.com ( @EliSawic )

Page 15: iOSCon

Non-Terminating• Next

EliaszSawicki.com ( @EliSawic )

Page 16: iOSCon

Terminating

• Completed

• Failed

• Interrupted (Reactive Cocoa)

EliaszSawicki.com ( @EliSawic )

Page 17: iOSCon

This screen is a signal

EliaszSawicki.com ( @EliSawic )

Page 18: iOSCon

Represents events over time

EliaszSawicki.com ( @EliSawic )

Page 19: iOSCon

Observe

EliaszSawicki.com ( @EliSawic )

Page 20: iOSCon

EliaszSawicki.com ( @EliSawic )

Page 21: iOSCon

If you don't observe, it's gone

EliaszSawicki.com ( @EliSawic )

Page 22: iOSCon

Observingpresentation.observeValues { idea in remember(idea: idea)}

presentation.observeCompleted { print("Time for a break")}

EliaszSawicki.com ( @EliSawic )

Page 23: iOSCon

Signal producer

EliaszSawicki.com ( @EliSawic )

Page 24: iOSCon

Represents a tasks

EliaszSawicki.com ( @EliSawic )

Page 25: iOSCon

Does not start it's work if not asked

EliaszSawicki.com ( @EliSawic )

Page 26: iOSCon

Producingpresenter.startWithSignal { (signal, _) in signal.observeValues { idea in print(idea) }

signal.observeCompleted { print("Time for a break") }}

EliaszSawicki.com ( @EliSawic )

Page 27: iOSCon

Hot vs Cold

EliaszSawicki.com ( @EliSawic )

Page 28: iOSCon

Signal SignalProducer

presentation.observeValues presentation.startWithValues

EliaszSawicki.com ( @EliSawic )

Page 29: iOSCon

Signal SignalProducer

presentation.observeValues presentation.startWithValues

emits values all the time waits for your request

EliaszSawicki.com ( @EliSawic )

Page 30: iOSCon

Properties

EliaszSawicki.com ( @EliSawic )

Page 31: iOSCon

Bindings

EliaszSawicki.com ( @EliSawic )

Page 32: iOSCon

Binding examplelet (slides, _) = Signal<Slide, NoError>.pipe()

label.reactive.text <~ slides.map { return "Slide: \($0.number)" }

EliaszSawicki.com ( @EliSawic )

Page 33: iOSCon

Memory Management

EliaszSawicki.com ( @EliSawic )

Page 34: iOSCon

Disposables

EliaszSawicki.com ( @EliSawic )

Page 35: iOSCon

Free your memorylet disposable = signal.observeValues { value in ...}

deinit { disposable.dispose()}

EliaszSawicki.com ( @EliSawic )

Page 36: iOSCon

FUNctional reactive programming

EliaszSawicki.com ( @EliSawic )