Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reactive Cocoa 101 [pt-BR]

Marlon Andrade
September 30, 2015

Reactive Cocoa 101 [pt-BR]

Talk apresentada no CocoaHeads JF no dia 30/09/2015

Foi apresentado o básico sobre conceitos de Funcional Reactive Programming, conceitos de Stream e Signal e algumas principais transformações. Foi demonstrado também um exemplo de código utilizando uma forma imperativa e o contraste utilizando reactive.

Sample de código em https://github.com/marlonandrade/reactive-cocoa-heads

Marlon Andrade

September 30, 2015
Tweet

More Decks by Marlon Andrade

Other Decks in Technology

Transcript

  1. ReactiveCocoa • criado pelo GitHub durante o desenvolvimento do GitHub

    Desktop for Mac • inspirado no Reactive Extensions (Rx) do .NET • Funcional Reactive Programming
  2. Functional Programming • funções first-class, podem ser passadas como parâmetros

    para outras funções • evita estado e dados mutáveis • declarativo, ou seja, define a lógica sem definir o control flow detalhadamente
  3. Reactive Programming • foco no fluxo de dados • propagação

    de mudanças • planilha do excel, modificação em célula gera reações em outras
  4. Functional Reactive • foco no fluxo de dados • evita

    estado e dados mutáveis • declarativo
  5. RACSubject *letters = [RACSubject subject]; RACSubject *numbers = [RACSubject subject];

    [[RACSignal merge:@[ letters, numbers ]] subscribeNext:^(NSString *letterOrNumber) { NSLog(@"%@", letterOrNumber); }]; // output A > B > 1 > 2 > C > 3 [letters sendNext:@"A"]; [letters sendNext:@"B"]; [numbers sendNext:@"1"]; [numbers sendNext:@"2"]; [letters sendNext:@"C"]; [numbers sendNext:@"3"];
  6. RACSubject *letters = [RACSubject subject]; RACSubject *numbers = [RACSubject subject];

    [[RACSignal zip:@[ letters, numbers ]] subscribeNext:^(RACTuple *tuple) { NSLog(@"%@-%@", tuple.first, tuple.second); }]; // output A-1 > B-2 > C-3 [letters sendNext:@"A"]; [letters sendNext:@"B"]; [numbers sendNext:@"1"]; [numbers sendNext:@"2"]; [letters sendNext:@"C"]; [numbers sendNext:@"3"];
  7. RACSubject *letters = [RACSubject subject]; RACSubject *numbers = [RACSubject subject];

    [[RACSignal combineLatest:@[ letters, numbers ]] subscribeNext:^(RACTuple *tuple) { NSLog(@"%@-%@", tuple.first, tuple.second); }]; // output B-1 > B-2 > C-2 > C-3 [letters sendNext:@"A"]; [letters sendNext:@"B"]; [numbers sendNext:@"1"]; [numbers sendNext:@"2"]; [letters sendNext:@"C"]; [numbers sendNext:@"3"];
  8. // RACSignal *validSignal … // NSNumber "bool" que define se

    válido ou não [[validSignal map:^UIColor*(NSNumber *number) { return number.boolValue ? [UIColor clearColor] : [UIColor redColor]; }] subscribeNext:^(UIColor *color) { textField.backgroundColor = color; }];
  9. // RACSignal *validSignal … // NSNumber "bool" que define se

    válido ou não RAC(textField, backgroundColor) = [validSignal map:^UIColor*(NSNumber *validValue) { return validValue.boolValue ? [UIColor clearColor] : [UIColor redColor]; }];
  10. // RACSignal *validLogin … // RACSignal *validPassword … // NSNumber

    "bool" que define se válido ou não RAC(submitButton, enabled) = [RACSignal combineLatest:@[ validLogin, validPassword ] reduce:^id(NSNumber *loginValid, NSNumber *passValid){ return @(loginValid.boolValue && passValid.boolValue); }];