Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Reactive Cocoa e MVVM
Search
Guilherme Martinez Sampaio
October 30, 2014
Programming
1
100
Reactive Cocoa e MVVM
Palestra dada no CocoaHeads CPS Outubro/2013
Guilherme Martinez Sampaio
October 30, 2014
Tweet
Share
More Decks by Guilherme Martinez Sampaio
See All by Guilherme Martinez Sampaio
CocoaPods: Gerenciador de Dependência para iOS e Mac
gsampaio
0
74
Other Decks in Programming
See All in Programming
【re:Growth 2024】 Aurora DSQL をちゃんと話します!
maroon1st
0
780
Go の GC の不得意な部分を克服したい
taiyow
3
800
rails stats で紐解く ANDPAD のイマを支える技術たち
andpad
1
290
ブラウザ単体でmp4書き出すまで - muddy-web - 2024-12
yue4u
3
480
Beyond ORM
77web
7
940
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
190
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
400
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
180
php-conference-japan-2024
tasuku43
0
320
Monixと常駐プログラムの勘どころ / Scalaわいわい勉強会 #4
stoneream
0
280
nekko cloudにおけるProxmox VE利用事例
irumaru
3
440
Recoilを剥がしている話
kirik
5
6.8k
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
Automating Front-end Workflow
addyosmani
1366
200k
Navigating Team Friction
lara
183
15k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Gamification - CAS2011
davidbonilla
80
5.1k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Faster Mobile Websites
deanohume
305
30k
Transcript
INTRODUÇÃO A REACTIVE FUNCTIONAL PROGRAMMING. by Guilherme Martinez Sampaio
Guilherme Martinez Sampaio iOS Developer @gsampaio
None
None
Agenda ▸ Functional Reactive Programming ▸ Reactive Cocoa ▸ Model
View View Model ▸ Demo ▸ Referências
FUNCTIONAL REACTIVE PROGRAMMING?
None
FUNCTIONAL REACTIVE PROGRAMMING IS A PROGRAMMING PARADIGM FOR reactive programming
USING THE BUILDING BLOCKS OF functional programming.
FRP HAS BEEN USED FOR PROGRAMMING GUI, ROBOTICS, AND MUSIC,
AIMING TO SIMPLIFY THESE PROBLEMS BY EXPLICITLY modeling time.
EM OUTRAS PALAVRAS DESCREVEMOS NOSSOS PROGRAMAS COMO EVENTOS QUE REAGEM
COM o tempo
Reactive Cocoa
RAC É FORTEMENTE BASEADA NO RXEXTENSIONS DA MICROSOFT PARA .NET
RAC SE BASEIA EM Signals E Sequences
AO INVÉS DE USAR variáveis QUE SÃO ALTERADAS USAMOS sinais
QUE CAPTURA O valor atual E valores futuros.
SINAIS FUNCIONAM COMO Promises
SINAIS TEM subscribers QUE ESCUTAM SUAS ALTERAÇÕES
SUBSCRIBERS RECEBEM 3 eventos
NEXT
COMPLETED
ERROR
RACSIGNAL __block NSUInteger subscribers = 0; RACSignal *signal = [RACSignal
createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) { subscribers++; [subscriber sendNext:@(subscribers)]; [subscriber sendCompleted]; return nil; }]; [signal subscribeNext:^(id x) { NSLog(@"%@", x) } error:^(NSError *error) { NSLog(@"ERRO !"); } completed:^{ NSLog(@"Signal completo"); }] /** Output: 1 Signal completo **/
SINAIS SÃO EXECUTADOS A A PARTIR DO MOMENTO QUE ELE
TEM UM subscriber ATÉ ELE ENVIAR UM SINAL DE completed
SINAIS PODEM TER VÁRIOS subscribers
PODEMOS COMPOR SINAIS USANDO programação funcional
RACSIGNAL __block NSUInteger subscribers = 2; RACSignal *signal = [RACSignal
createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) { subscribers++; [subscriber sendNext:@(subscribers)]; [subscriber sendCompleted]; return nil; }]; RACSignal *powSingal = [signal map:^NSNumber(NSNumber *value){ NSUInteger intValue = [value unsignedIntegerValue]; return @(intValue * intValue); }]; [signal subscribeNext:^(id x) { NSLog(@"VALUE: %@", x); }]; /** Outputs: 9 **/
COLLECTIONS PODEM GERAR RACSequence QUE POR SUA VEZ PODEMOS USAR
APLICAR Programação Funcional
RACSEQUENCE NSArray *lettersArray = [@"A B C D E F
G H I" componentsSeparatedByString:@" "]; RACSignal *letters = lettersArray.rac_sequence.signal; [letters subscribeNext:^(NSString *x) { NSLog(@"%@", x); }]; /** Outputs: A B C D E F G H I **/
RACSEQUENCE RACSignal *numbers = [@[@(1), @(2), @(3)].rac_sequence.signal; RACSignal *pow =
[numbers map:^NSNumber*(NSNumber *value){ NSUInteger intValue = [value unsignedIntegerValue]; return @(intValue * intValue); }]; [pow subscribeNext:^(NSNumber *value) { NSLog(@"%@", value); }]; /** Outputs: 1 4 9 **/
RAC CONTEM MACROS PARA FAZER data-binding
RAC() @interface ViewController () @property(nonatomic) NSUInteger *foo; @property(nonatomic) NSUInteger *bar;
@end @implementation ViewController - (void)viewDidLoad { self.foo = 0; self.bar = 0; NSLog(@"FOO: %@", @(self.foo)); RAC(self, foo) = RACObserve(self, bar); self.bar = 1; NSLog(@"FOO: %@", @(self.foo)); } @end /** Outputs: FOO: 0 FOO: 1 **/
MVVM
MODEL VIEW VIEW-MODEL É UM ARCHITECTURAL PATTERN SEMELHANTE AO MVC
MODEL VIEW CONTROLLER
MAS NA REALIDADE O QUE ACONTECE É QUE FICAMOS COM
view controllers gigantes
MODEL VIEW CONTROLLER
COM MVVM MOVEMOS A LÓGICA DE NEGOCIO TOTALMENTE FORA DO
VC
E TRATAMOS O VC COMO PARTE DA VIEW UMA VEZ
QUE ELE TRATA APRESENTAÇÃO, ROTAÇÃO E NAVEGAÇÃO.
MODEL VIEW VIEW-MODEL
PARA CADA VIEW CRIAMOS UM VIEW MODEL QUE TRATA ELA.
USAMOS DATA BINDING PARA FAZER COMUNICAÇÃO.
MODEL VIEW VIEW MODEL @interface ViewController () @property(nonatomic, strong) ViewModel
*viewModel; @property(nonatomic, weak) UITextField *textField; @property(nonatomic, weak) UILabel *label; @end @implementation ViewController - (void)viewDidLoad { RAC(self.viewModel, text) = [self.textField rac_textSignal]; RAC(self.label, text) = [self.viewModel expensiveComputation]; } @end
VIEW MODELS facilitam escrever testes de uma view. UMA VEZ
QUE TESTAMOS O COMPORTAMENTO DAS VIEWS AO INVÉS DA VIEW EM SI
VIEW MODELS PREGAM Composição sobre Herança.
FAZENDO COM QUE TENHAMOS UM CÓDIGO mais reaproveitável.
UMA VEZ QUE PODEMOS PLUGAR OS VIEW MODELS QUE QUEREMOS
NOS NOSSOS VC
COM ALGUMA EXCESSÕES VIEW MODELS SÃO independentes de plataforma.
DEMO
REFERÊNCIAS ▸ FRP - http://en.wikipedia.org/wiki/ Functional_reactive_programming ▸ Reactive Cocoa -
https://github.com/ ReactiveCocoa/ReactiveCocoa ▸ Model View View Model - http://www.objc.io/ issue-13/mvvm.html
TWITTER ▸ @jspahrsummers ▸ @joshaber ▸ @rob_rix ▸ @indragie ▸
@ashfurrow
SLIDES E DEMO https://github.com/gsampaio/RACMVVMPresentation
THANKS
None