Slide 1

Slide 1 text

Reactive Cocoa Hari Balamani Monday, 8 July 13

Slide 2

Slide 2 text

reactive programming ? Monday, 8 July 13

Slide 3

Slide 3 text

Monday, 8 July 13

Slide 4

Slide 4 text

var x = 10; var y = 5; var z = x + y; x = 20; assert.areEqual(25, z); Monday, 8 July 13

Slide 5

Slide 5 text

var x = 10; var y = 5; var z = x + y; x = 20; assert.areEqual(25, z); Monday, 8 July 13

Slide 6

Slide 6 text

imperative programming var x = 10; var y = 5; var z = x + y; x = 20; assert.areEqual(25, z); Monday, 8 July 13

Slide 7

Slide 7 text

var x := 10; var y := 5; var z := x + y; x := 20; assert.areEqual(25, z); Monday, 8 July 13

Slide 8

Slide 8 text

var x := 10; var y := 5; var z := x + y; x := 20; assert.areEqual(25, z); Monday, 8 July 13

Slide 9

Slide 9 text

reactive programming var x := 10; var y := 5; var z := x + y; x := 20; assert.areEqual(25, z); Monday, 8 July 13

Slide 10

Slide 10 text

imperative programming Monday, 8 July 13

Slide 11

Slide 11 text

imperative programming • tell the “machine” how to do something and as a result what you want to happen will happen Monday, 8 July 13

Slide 12

Slide 12 text

imperative programming • tell the “machine” how to do something and as a result what you want to happen will happen NSArray *names = @[@"apple", @"google", @"microsoft"]; NSMutableArray *decoratedNames = [NSMutableArray array]; for (int i = 0; i < names.count; i++ ) { decoratedNames[i] = [names[i] uppercaseString]; } // decoratedNames: @[ @"APPLE", @"GOOGLE", @"MICROSOFT" ] Monday, 8 July 13

Slide 13

Slide 13 text

declarative programming Monday, 8 July 13

Slide 14

Slide 14 text

declarative programming • tell the “machine” what you would like to happen, and let the machine figure out how to do it Monday, 8 July 13

Slide 15

Slide 15 text

declarative programming • tell the “machine” what you would like to happen, and let the machine figure out how to do it id *decoratedNames = [@[@"apple", @"google", @"microsoft"] ! ! ! ! ! map:^id(NSString *name){ ! ! ! ! ! ! return [name uppercaseString]; ! ! ! ! ! }]; // decoratedNames: @[ @"APPLE", @"GOOGLE", @"MICROSOFT" ] Monday, 8 July 13

Slide 16

Slide 16 text

so what? • Increases the complexity • maintaining lots of states • unwanted templates/boilerplate codes (delegates/protocols/KVO/notofications etc) • poor code locality (where does this code belong) Monday, 8 July 13

Slide 17

Slide 17 text

Reactive Programming “Programming around data flows and the propagation of change” Monday, 8 July 13

Slide 18

Slide 18 text

streams Monday, 8 July 13

Slide 19

Slide 19 text

streams • sequence of values • values over variables • no in-place modification Monday, 8 July 13

Slide 20

Slide 20 text

signals Monday, 8 July 13

Slide 21

Slide 21 text

signals • observes the streams • reacts to the past, present & future values • similar to promises / futures Monday, 8 July 13

Slide 22

Slide 22 text

trace our test x y z:= x+y 10 5 15 Monday, 8 July 13

Slide 23

Slide 23 text

trace our test x y z:= x+y 10 x 5 15 Monday, 8 July 13

Slide 24

Slide 24 text

trace our test x y z:= x+y 10 x 5 20 15 Monday, 8 July 13

Slide 25

Slide 25 text

trace our test x y z:= x+y 10 x 5 20 15 Monday, 8 July 13

Slide 26

Slide 26 text

trace our test x y z:= x+y 10 x 5 20 15 30 Monday, 8 July 13

Slide 27

Slide 27 text

trace our test x y z:= x+y 10 x 20 5 20 15 30 Monday, 8 July 13

Slide 28

Slide 28 text

trace our test x y z:= x+y 10 x 20 5 20 x 15 30 Monday, 8 July 13

Slide 29

Slide 29 text

trace our test x y z:= x+y 10 x 20 5 20 x 15 30 Monday, 8 July 13

Slide 30

Slide 30 text

trace our test x y z:= x+y 10 x 20 5 20 x 15 30 40 Monday, 8 July 13

Slide 31

Slide 31 text

trace our test x y z:= x+y 10 x 20 25 5 20 x 15 30 40 Monday, 8 July 13

Slide 32

Slide 32 text

trace our test x y z:= x+y 10 x 20 25 5 20 x 25 15 30 40 Monday, 8 July 13

Slide 33

Slide 33 text

trace our test x y z:= x+y 10 x 20 25 5 20 x 25 15 30 40 Monday, 8 July 13

Slide 34

Slide 34 text

trace our test x y z:= x+y 10 x 20 25 5 20 x 25 15 30 40 50 Monday, 8 July 13

Slide 35

Slide 35 text

trace our test x y z:= x+y 10 x 20 25 x 5 20 x 25 15 30 40 50 Monday, 8 July 13

Slide 36

Slide 36 text

trace our test x y z:= x+y 10 x 20 25 x 5 20 x 25 x 15 30 40 50 Monday, 8 July 13

Slide 37

Slide 37 text

trace our test x y z:= x+y 10 x 20 25 x 5 20 x 25 x 15 30 40 50 Monday, 8 July 13

Slide 38

Slide 38 text

trace our test x y z:= x+y 10 x 20 25 x 5 20 x 25 x 15 30 40 50 x Monday, 8 July 13

Slide 39

Slide 39 text

Reactive Cocoa A [Cocoa] framework for composing and transforming streams of values Monday, 8 July 13

Slide 40

Slide 40 text

3 key components • RACSignal • sends a sequence of events with some data • RACSubscriber • receives from signals • RACDisposable • encapsulates cleanup and deallocation Monday, 8 July 13

Slide 41

Slide 41 text

RACSignal • n (arbitrary length of next) events sending data • multiple values can be sent a tuples • completion and an error event Monday, 8 July 13

Slide 42

Slide 42 text

RACSubscriber • subscribe to events sent by RACSignal • a protocol that can be implemented anywhere Monday, 8 July 13

Slide 43

Slide 43 text

RACSubscriber • subscribe to events sent by RACSignal • a protocol that can be implemented anywhere [RACSignal someSignal] subscribeNext:^(id x) { NSLog(@"Next event : %@", x);} completed : ^{ NSLog(@"done!");} error : ^(NSError *error){ NSLog(@"Error : %@", error); }]; Monday, 8 July 13

Slide 44

Slide 44 text

Bridges • RACAble() Macro - Signals from KVO • RAC() Macro - Subscribes from Key Path • RACSubject - Mutable signal • -rac_lift_selector - Make signals from method invocations • -rac_signalForControlEvents - Signals from UIControl action • -rac_addObserverForName - Signals from Notification center Monday, 8 July 13

Slide 45

Slide 45 text

demo [email protected]:hari-tw/reactivecocoa-playground.git Monday, 8 July 13

Slide 46

Slide 46 text

when to use • Handling asynchronous events • chaining dependent events • parallelizing independent work • simplifying collections transformations Monday, 8 July 13

Slide 47

Slide 47 text

references • https://github.com/ReactiveCocoa/ReactiveCocoa • Input and Output – j.mp/joshaberio • https://github.com/andrewsardone/RACMobiDevDay Monday, 8 July 13

Slide 48

Slide 48 text

thanks Monday, 8 July 13