Slide 1

Slide 1 text

RXSWIFT REACTIVE PROGRAMMING WITH + =

Slide 2

Slide 2 text

ABOUT ME

Slide 3

Slide 3 text

ABOUT YOU ▸Swift ▸Reactive programming

Slide 4

Slide 4 text

TRADITIONAL VS. REACTIVE A SIMPLE EXAMPLE IN IOS

Slide 5

Slide 5 text

MODEL

Slide 6

Slide 6 text

VIEW MODEL

Slide 7

Slide 7 text

VIEW CONTROLLER

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

REACTIVE VIEW MODEL

Slide 10

Slide 10 text

REACTIVE VIEW CONTROLLER

Slide 11

Slide 11 text

THE RESULTS 40% SAVINGS

Slide 12

Slide 12 text

Reactive Programming is essentially about modeling asynchronous sequences What is Reactive Programming?

Slide 13

Slide 13 text

Reactive Programming is essentially about modeling asynchronous sequences

Slide 14

Slide 14 text

What is Reactive Programming? Reactive Programming is essentially about modeling asynchronous sequences So what is RxSwift? RxSwift implements patterns, types, and operators to create and work with Observable sequences

Slide 15

Slide 15 text

REACTIVE EXTENSIONS N ov. ‘09 Rx.N ET RxJS M ar. ‘10 RxJava M ar. ‘12 RxC pp N ov. ‘12 RxRuby D ec. ‘12 RxScala, RxC lojure, RxG roovy, RxJRuby Jan. ‘13 RxPY, RxPH P M ar. ‘13 RxKotlin O ct. ‘13 RxSw ift Feb. ‘15

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

ABOUT RX ▸ Event-driven ▸ Asynchronous ▸ Functional ▸ Common patterns ▸ Observer ▸ Iterator ▸ Cross-platform

Slide 18

Slide 18 text

LIFECYCLE OF AN OBSERVABLE SEQUENCE ▸ Next 1 2 3

Slide 19

Slide 19 text

LIFECYCLE OF AN OBSERVABLE SEQUENCE ▸ Next tap tap tap

Slide 20

Slide 20 text

LIFECYCLE OF AN OBSERVABLE SEQUENCE ▸ Next ▸ Error 1 2 3

Slide 21

Slide 21 text

LIFECYCLE OF AN OBSERVABLE SEQUENCE ▸ Next ▸ Error ▸ Completed 1 2 3

Slide 22

Slide 22 text

LIFECYCLE OF AN OBSERVABLE SEQUENCE ▸ Next ▸ Error ▸ Completed ▸ dispose() / DisposeBag 1 2 3

Slide 23

Slide 23 text

RXSWIFT ▸RxSwift ▸RxCocoa ▸RxSwiftCommunity ▸ RxDataSources

Slide 24

Slide 24 text

SETUP ▸ Install ThisCouldBeUsButYouPlaying ▸ bit.ly/podsPlaygrounds ▸ gem install cocoapods-playgrounds ▸ Create RxSwiftPlayground ▸ pod playgrounds RxSwift

Slide 25

Slide 25 text

SETUP //: Please build the scheme 'RxSwiftPlayground' first import XCPlayground XCPlaygroundPage.currentPage.needsIndefiniteExecution = true import RxSwift func exampleOf(description: String, action: Void -> Void) { print("\n--- Example of:", description, "---") action() }

Slide 26

Slide 26 text

--- Example of: just --- Next(32) Completed CREATING & SUBSCRIBING exampleOf("just") { Observable.just(32) } .subscribe { } print($0)

Slide 27

Slide 27 text

--- Example of: just --- Next(32) Completed exampleOf("just") { Observable.just(32) .subscribe { element in print(element) } } CREATING & SUBSCRIBING

Slide 28

Slide 28 text

--- Example of: just --- 32 exampleOf("just") { _ = Observable.just(32) .subscribeNext { print($0) } } CREATING & SUBSCRIBING

Slide 29

Slide 29 text

--- Example of: of --- 1 2 3 4 5 CREATING & SUBSCRIBING exampleOf("of") { Observable.of(1, 2, 3, 4, 5) } .subscribeNext { print($0) } .dispose()

Slide 30

Slide 30 text

exampleOf("toObservable") { } --- Example of: toObservable --- 1 2 3 CREATING & SUBSCRIBING let disposeBag = DisposeBag() [1, 2, 3].toObservable() .subscribeNext { print($0) } .addDisposableTo(disposeBag)

Slide 31

Slide 31 text

CREATING & SUBSCRIBING let string = BehaviorSubject(value: "Hello") string.subscribe { print($0) } .addDisposableTo(disposeBag) exampleOf("BehaviorSubject") { let disposeBag = DisposeBag() } string.on(.Next("World!"))

Slide 32

Slide 32 text

CREATING & SUBSCRIBING let string = BehaviorSubject(value: "Hello") string.subscribe { print($0) } .addDisposableTo(disposeBag) string.onNext("World!") exampleOf("BehaviorSubject") { let disposeBag = DisposeBag() }

Slide 33

Slide 33 text

--- Example of: BehaviorSubject --- Next(Hello) Next(World!) CREATING & SUBSCRIBING let string = BehaviorSubject(value: "Hello") string.subscribe { print($0) } .addDisposableTo(disposeBag) string.onNext("World!") exampleOf("BehaviorSubject") { let disposeBag = DisposeBag() }

Slide 34

Slide 34 text

CREATING & SUBSCRIBING --- Example of: Variable --- Next(1) Next(12) Next(1234567) Completed number.value = 12 number.value = 1_234_567 exampleOf("Variable") { let disposeBag = DisposeBag() let number = Variable(1) number.asObservable() .subscribe { print($0) } .addDisposableTo(disposeBag) }

Slide 35

Slide 35 text

TRANSFORMING --- Example of: map --- 1 4 9 Observable.of(1, 2, 3) example("map") { let disposeBag = DisposeBag() } .map { $0 * $0 } .subscribeNext { print($0) } .addDisposableTo(disposeBag)

Slide 36

Slide 36 text

TRANSFORMING 1 1 2 4 3 9 map { $0 * $0 }

Slide 37

Slide 37 text

TRANSFORMING --- Example of: flatMap --- Scott Lori Eric exampleOf("flatMap") { let disposeBag = DisposeBag() } struct Person { var name: Variable } let scott = Person(name: Variable("Scott")) let lori = Person(name: Variable("Lori")) let person = Variable(scott) person.asObservable() .flatMap { $0.name.asObservable() } .subscribeNext { print($0) } .addDisposableTo(disposeBag) person.value = lori scott.name.value = "Eric"

Slide 38

Slide 38 text

TRANSFORMING --- Example of: flatMapLatest --- Scott Lori exampleOf("flatMapLatest") { let disposeBag = DisposeBag() struct Person { var name: Variable } let scott = Person(name: Variable("Scott")) let lori = Person(name: Variable("Lori")) let person = Variable(scott) person.asObservable() .flatMapLatest { $0.name.asObservable() } .subscribeNext { print($0) } .addDisposableTo(disposeBag) person.value = lori scott.name.value = "Eric" }

Slide 39

Slide 39 text

TRANSFORMING exampleOf("flatMapLatest") { let disposeBag = DisposeBag() struct Person { var name: Variable } let scott = Person(name: Variable("Scott")) let lori = Person(name: Variable("Lori")) let person = Variable(scott) person.asObservable() .debug("person") .flatMapLatest { $0.name.asObservable() } .subscribeNext { print($0) } .addDisposableTo(disposeBag) person.value = lori scott.name.value = "Eric" } --- Example of: flatMapLatest --- 2016-05-28 07:31:22.555: person -> subscribed 2016-05-28 07:31:22.556: person -> Event Next((Person #1)(nam...able)) Scott 2016-05-28 07:31:22.557: person -> Event Next((Person #1)(nam...able)) Lori 2016-05-28 07:31:22.560: person -> Event Completed 2016-05-28 07:31:22.560: person -> disposed

Slide 40

Slide 40 text

RXSWIFT OPERATORS ▸ Creating asObservable create deferred empty error toObservable interval never just of range repeatElement timer ▸ Transforming buffer flatMap flatMapFirst flatMapLatest map scan window ▸ Filtering debounce / throttle distinctUntilChanged elementAt filter sample skip take takeLast single ▸ Conditional & Boolean amb skipWhile skipUntil takeUntil takeWhile ▸ Mathematical & Aggregate concat reduce toArray ▸ Connectable multicast publish refCount replay shareReplay ▸ Combining merge startWith switchLatest combineLatest zip ▸ Error Handling catch retry retryWhen ▸ Observing delaySubscription do / doOnNext observeOn subscribe subscribeOn timeout using debug

Slide 41

Slide 41 text

exampleOf("distinctUntilChanged") { let disposeBag = DisposeBag() let searchString = Variable("iOS") searchString.asObservable() .map { $0.lowercaseString } .distinctUntilChanged() .subscribeNext { print($0) } .addDisposableTo(disposeBag) searchString.value = "IOS" searchString.value = "Rx" searchString.value = "ios" } FILTERING --- Example of: distinctUntilChanged --- ios rx ios

Slide 42

Slide 42 text

exampleOf("combineLatest") { let disposeBag = DisposeBag() let number = PublishSubject() let string = PublishSubject() Observable.combineLatest(number, string) { "\($0) \($1)" } .subscribeNext { print($0) } .addDisposableTo(disposeBag) number.onNext(1) print("Nothing yet") string.onNext("A") number.onNext(2) string.onNext("B") string.onNext("C") } COMBINING --- Example of: combineLatest --- Nothing yet 1 A 2 A 2 B 2 C

Slide 43

Slide 43 text

exampleOf("takeWhile") { [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1].toObservable() .takeWhile { $0 < 5 } .subscribeNext { print($0) } .dispose() } CONDITIONAL --- Example of: takeWhile --- 1 2 3 4

Slide 44

Slide 44 text

MATHEMATICAL --- Example of: _scan --- 11 13 16 20 25 exampleOf("scan") { Observable.of(1, 2, 3, 4, 5) .subscribeNext { print($0) } .dispose() } .scan(10, accumulator: +)

Slide 45

Slide 45 text

MATHEMATICAL --- Example of: _scan --- 11 13 16 20 25 exampleOf("scan") { Observable.of(1, 2, 3, 4, 5) .subscribeNext { print($0) } .dispose() } .scan(10) { $0 + $1 }

Slide 46

Slide 46 text

ERROR HANDLING --- Example of: error --- A exampleOf("error") { enum Error: ErrorType { case A } Observable.error(Error.A) .subscribeError { // Handle error print($0) } .dispose() }

Slide 47

Slide 47 text

NETWORKING

Slide 48

Slide 48 text

NETWORKING

Slide 49

Slide 49 text

NETWORKING

Slide 50

Slide 50 text

NETWORKING

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

NETWORKING

Slide 53

Slide 53 text

How about one more?

Slide 54

Slide 54 text

RXCOREDATA

Slide 55

Slide 55 text

RXCOREDATA

Slide 56

Slide 56 text

NETWORKING

Slide 57

Slide 57 text

How do I get started with RxSwift? I’m glad you asked! !

Slide 58

Slide 58 text

LEARN RXSWIFT ▸This talk ▸RxSwift operators

Slide 59

Slide 59 text

RXSWIFT OPERATORS

Slide 60

Slide 60 text

LEARN RXSWIFT ▸This talk ▸RxSwift operators ▸RxCocoa ▸RxExample

Slide 61

Slide 61 text

RXSWIFT OPERATORS

Slide 62

Slide 62 text

RXSWIFT OPERATORS

Slide 63

Slide 63 text

LEARN RXSWIFT ▸This talk ▸RxSwift operators ▸RxCocoa ▸RxExample ▸RxCommunity

Slide 64

Slide 64 text

▸ github.com/ReactiveX/RxSwift ▸ reactivex.io ▸ rxmarbles.com ▸ slack.rxswift.org ▸ rx-marin.com ▸ as.ync.io ▸ github.com/scotteg/RxSwiftPlayer ▸ github.com/Artsy/eidolon ▸ lynda.com/Scott-Gardner/281956-1.html WANT MORE RXSWIFT?

Slide 65

Slide 65 text

QUESTIONS?

Slide 66

Slide 66 text

THANK YOU! Scott Gardner @scotteg scotteg.com as.ync.io bit.ly/scottOnLyndaDotCom