SlideShare une entreprise Scribd logo
1  sur  56
Télécharger pour lire hors ligne
(Func&onal)+Reac&ve+Programming 
with%Reac*veCocoa 
Florent(Pillet 
fpillet@gmail.com 
@fpillet
Reac%ve!programming?
Reac%ve'programming'is'essen%ally 
working'with 
asynchronous*data*streams
Data!changes!over!$me!and!flows!in!streams! 
processed!with!an!asynchronous,!operator5 
based!logic.
They%are%all%separate,%yet%usually%found%at%the% 
same%place%in%the%code.
Build&modern,&highly&interac3ve,&dynamic& 
applica3ons 
with%minimal%pain.
Learning(curve(is(steep1 
Need$to$let$go$of$impera/ve$habits,$learn$new$abstrac/ons$and$ 
pa8erns 
but... 
1"If"you"read"only"one,"it"should"be"The"introduc6on"to"reac6ve"programming"you've"been"missing
Pays%off%big%+me 
Modular 
Reusable 
Expressive 
Testable(code
Reac%ve'programming'paves'the'way'to' 
elimina'ng)state)and)mutability'from'your' 
code.2 
2"Suggested"reading:"Enemy"of"the"state"presenta6on"by"Jus6n"Sparh9Summmers.
So#what#does#this#reac.ve#thing#look#like?
Signals
Signal of current GPS position (CLLocation) 
@100 @450 @300 @140 
time 
Signal of numerical values (NSNumber) 
@270 
Signal of boolean values (NSNumber) 
@YES @NO @YES
Signal of current GPS position (CLLocation) 
@100 @450 @300 @140 
time 
Signal of numerical values (NSNumber) 
@270 
Signal of boolean values (NSNumber) 
@YES @NO @YES 
Signals(send(events(over( 
&me 
A"signal"is"a"push,driven"stream. 
It#produces#three#types#of#events: 
• next"values 
• an"error 
• a"comple+on
next!values 
A"stream"of"values"delivered"over"0me. 
Signals(produce(zero,(one(or(many(next(values(before(either( 
comple*ng(or(producing(an(error. 
time 
Signal of current GPS position (CLLocation) 
next next next next next next
signal'comple'on 
time 
Signal with result of network request 
next completed
signal'error 
time 
Signal of network request emits error on request failure 
error 
(emits a NSError)
Opera&ons 
• A#signal#can#have#mul0ple#subscribers 
• Opera0ons#subcribe#to#a#signal#and#return#a#new#signal 
• Easy#mul0;staged#transforma0ons 
• Async,#async,#async!
map 
time 
Signal of current GPS position (CLLocation) 
B"="A.map(fn) 
@100 @270 
@450 @300 @140 
A 
B 
Signal of numerical values (NSNumber)
filter 
Signal of numerical values (NSNumber) 
@100 @270 
@450 @300 @140 
B"="A.filter(fn) 
@100 @140 
time 
A 
B
concat 
time 
A 
B 
C 
C"="A.concat(B)
merge 
time 
A 
B 
C 
C"="merge(A,B)
combineLatest 
time 
A 1 3 
B 
C 
6 7 8 
2 
C"="combineLatest(A,B) 
2 
6 
3 
6 
3 
7 
3 
8 
Signal of tuples
switchToLatest 
time 
D A C B 
E 
E"="D.switchToLatest() 
A 
B 
C
Other&opera*ons 
• flatten flattenMap zip zipWith startWith 
• delay throttle sample timeout 
• take takeUntil skip ignoreValues 
• try catch then switch if and or not 
• replay replayLast repeat retry 
..."and"a"lot"more"...
Reac%veCocoa
Main%classes%in%Reac+veCocoa 
• Signals:*RACSignal 
• Tuples:*RACTuple 
• Disposables:*RACDisposable 
• Schedulers:*RACScheduler 
• Commands:*RACCommand*(not*covered*here)
Subscribing*to*signals 
[someSignal subscribeNext:^(id nextValue) { 
// this is called asynchronously, every time a new value 
// is available on the signal 
NSLog(@"Signal emitted new value= %@", nextValue); 
}];
Subscribing*to*signals 
[someSignal subscribeNext:^(id nextValue) { 
NSLog(@"Signal emitted new value= %@", nextValue); 
} error:^(NSError *error) { 
NSLog(@"Signal emitted error %@", error); 
} completed:^{ 
NSLog(@"Signal completed"); 
}];
Unsubscribing*from*signals 
// subscribe 
RACDisposable *disposable = 
[someSignal subscribeNext:^(id nextValue) { 
NSLog(@"Signal emitted new value= %@", nextValue); 
}]; 
// can cancel subscription at any time 
[disposable dispose];
Crea%ng(signals 
• Using'KVO 
• Transforming'exis3ng'signals'into'a'new'signal 
• Dynamically'with'a'generator'block 
• Li>ing'from'the'impera3ve'world 
• Manually'producing'events
Signals(from(variables((KVO) 
Use$the$RACObserve(object,path)$macro$to$update$our$ 
unread$count$label3: 
[RACObserve(self.model, unreadCount) subscribeNext:^(NSNumber *value) { 
self.unreadCountLabel.text = [value stringValue]; 
}]; 
3"Real"developers"use"NSNumberForma+er
Transforming+exis.ng+signals 
- (RACSignal *)colorForUnreadCount { 
return [RACObserve(self.model,unreadCount) // this is a signal 
// 'map' subscribes to the signal above and returns 
// a new signal that sends a color for each new unreadCount 
map:^id(NSNumber *unread) { 
NSInteger count = unread.integerValue; 
return count < 10 ? [UIColor blackColor] : 
count < 20 ? [UIColor orangeColor] : 
[UIColor redColor]; 
}]; 
}
Transforming+exis.ng+signals 
// using the signal created in the previous slide 
[[model colorForUnreadCount] subscribeNext:^(UIColor *color) { 
self.unreadLabel.textColor = color; 
}]; 
// a shorter way to write this (for simple binding cases) 
// see <ReactiveCocoa/RACSusbscriptingAssignmentTrampoline.h> 
RAC(self.unreadLabel, textColor) = model.colorForUnreadCount;
Dynamic(signals 
- (RACSignal *)post:(NSDictionary *)formData toURL:(NSURL *)url { 
return [RACSignal createSignal:^(id<RACSubscriber> subscriber)] { 
// use AFNetworking to post form data 
NSURLSessionDataTask *task = [self.sessionManager POST:url parameters:data 
success:^(NSURLSessionDataTask *t, NSDictionary *responseObject) { 
if (responseObject) 
[subscriber sendNext:responseObject]; 
[subscriber sendCompleted]; 
} 
failure:^(NSURLSessionDataTask *t, NSError *error) { 
[subscriber sendError:error]; 
} 
]; 
return [RACDisposable disposableWithBlock:^{ 
[task cancel]; 
}]; 
}]; 
}
Dynamic(signals 
// use signal defined in previous slide 
RACSignal *postSignal = [manager post:@{@"name": @"Florent"} toURL:someURL]; 
[postSignal subscribeNext:^(NSDictionary *response) { 
NSLog(@"Server answered POST with %@", response); 
} error:^(NSError *error) { 
NSLog(@"POST failed with error: %@", error); 
} completed:{ 
NSLog(@"POST was successful"); 
}]
Li#ing&to&the&reac.ve&world 
[[[[[self 
rac_signalForSelector:@selector(locationManager:didRangeBeacons:inRegion:) 
fromProtocol:@protocol(CLLocationManagerDelegate)] 
reduceEach:^(CLLocationManager *manager, NSArray *beacons, CLBeaconRegion *region) { 
return [[beacons sortedArrayUsingFunction:proximityComparator context:NULL] 
firstObject] ?: [NSNull null]; 
}] 
filter:^BOOL(id value) { 
return [value isKindOfClass:[CLBeacon class]]; 
}] 
distinctUntilChanged] 
subscribeNext:^(CLBeacon *beacon) { 
NSLog(@"Last closest beacon: %@.%@", beacon.major, beacon.minor); 
}];
Manual&signals 
@property (strong) RACSubject *manualSignal; 
- (id)init { 
if (self = [super init]) { 
self.manualSignal = [[RACSubject alloc] init]; 
} 
return self; 
} 
- (void)dealloc { 
[self.manualSignal sendCompleted]; 
} 
- (RACSignal *)dataSignal { 
return self.manualSignal; 
} 
- (void)newDataObtained:(id)data { 
[self.manualSignal sendNext:data]; 
}
Manual&signals 
Note%that: 
• **RACSubject**#doesn't#automa.cally#emit#a#completed# 
event#on#dealloc.#You#must#do#it#manually. 
• Use#**RACReplaySubject**#to#create#a#subject#that#can# 
resend#one#or#more#of#the#last#next#values#to#new#subscribers. 
• Avoid#using#subjects#if#you#have#alterna.ves.
Disposables 
Any$subscrip,on$returns$a$RACDiposable.$Use$it$to$cancel$the$ 
subscrip,on
Schedulers 
• Based'on'serial'queues 
• Makes'cancella&on'easy! 
• Use'for'5mers'and'to'control'delivery'of'signals 
RACSignal *onMainThread = 
[signal deliverOn:[RACScheduler mainThreadScheduler]]; 
RACSignal *onSomeSerialQueue = 
[signal deliverOn:[[RACTargetQueueScheduler alloc] 
initWithName:@"My queue scheduler" 
targetQueue:someSerialQueue]]
Schedulers 
// A one-time timer that fires after 1 second on main thread 
RACDisposable *timer = [[RACScheduler mainThreadScheduler] 
afterDelay:1.0 
schedule:^{ 
NSLog(@"Delayed logging"); 
}]; 
// We can cancel this at any time 
[timer dispose];
Schedulers 
// A cancellable periodic action 
RACDisposable *timer = [[RACScheduler schedulerWithPriority:RACSchedulerPriorityDefault] 
after:[NSDate dateWithTimeIntervalSinceNow:1.0] 
repeatingEvery:0.5 
withLeeway:0.1 
schedule:^{ 
NSLog(@"Running periodic action on private queue"); 
}]; 
// Later: stop repeating 
[timer dispose];
Other&Reac*veCocoa&gems 
• @weakify @strongify @unsafeify 
• @onExit 
#import <ReactiveCocoa/RACExtScope.h> 
@weakify(self); 
[signal subscribeNext:^(id value) { 
@strongify(self); 
[self doSomethingWith:value]; 
}];
..."and"there"is"a"lot"more"... 
Commands,)sequences,)signal)mul1cas1ng,)side)effects,)channels,) 
backtraces)&)debugging)features,)event)materializa1on)and) 
dematerializa1on,)tes1ng)are)among)topics)not)covered)here. 
Framework)source)code)and)the)docset)for)Dash)are)useful) 
resources.
More%usage%examples 
- (RACSignal *)numberOfUnreadItems 
{ 
@weakify(self); 
return [[[[[self 
itemsUpdated] 
startWith:@YES] 
map:^(id updated) { 
@strongify(self); 
return self.unreadItemsCount; 
}] 
distinctUntilChanged] 
deliverOn:RACScheduler.mainThreadScheduler]; 
}]; 
}
More%usage%examples 
// Automatically update a badge on tab bar 
// when the count of unread items changes 
- (void)keepNewsItemUpToDate:(UITabBarItem *)newsItem { 
@weakify(newsItem); 
[self.model.numberOfUnreadItems subscribeNext:^(NSNumber *count) { 
@strongify(newsItem); 
if (count.integerValue) 
newsItem.badge = count.stringValue; 
else 
newsItem.badge = @""; 
}]; 
}
Links 
• Reac&veCocoa*framework 
• A*demo*project:*Reac&veWeather 
• The*introduc&on*to*reac&ve*programming*you've*been*missing 
• Enemy*of*the*state 
• Reac&ve*MVVM*(ModelFViewFViewModel):*perfect*match 
Also%look%up%'Reac.ve'%on%Github%and%filter%by%langage%(Obj>C).
Scary&interlude 
Yellow&parts&are&my&app. 
Not$always$like$this. 
This$shouldn't$put$you$off!
Summary
Reac%ve'programming'is'a'logical'way'to' 
model'and'react'to 
asynchronous'informa%on'flow
Reac%ve'code'clearly5'exposes'logic'and' 
transforma-ons'deriving'from'new'data 
5"finding"the"syntax"weird?"remember"your"first"steps"with"Objec:ve<C"and"all"these"square"brackets...
Enforcing)the)separa0on)between)data) 
producers)and)consumers,)reac0ve)code)is) 
more%testable
Once%trained%to%think%reac.vely, 
reducing)state)and)mutability 
is#the#next#logical#step#towards#code#safety,# 
stability#and#predictability.
Reac%veCocoa)is)a)rich)and)powerful)reac%ve) 
programming)framework)that)will)bring)your) 
code)to)a)new)level
Reac%veCocoa)is)a)rich)and)powerful)reac%ve) 
programming)framework)that)will)bring)your) 
code)to)a)new)level 
works&with&Swi+,&too4 
4"See"Colin"Eberhardt's"posts"for"Swi6,"Reac:veCocoa"and"MVVM"pr0n.
Thank&You&! 
Q"&"A 
fpillet@gmail.com 
@fpillet

Contenu connexe

Tendances

Avoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promisesAvoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promisesAnkit Agarwal
 
Node Boot Camp
Node Boot CampNode Boot Camp
Node Boot CampTroy Miles
 
An Introduction to Reactive Cocoa
An Introduction to Reactive CocoaAn Introduction to Reactive Cocoa
An Introduction to Reactive CocoaSmartLogic
 
Javascript Promises/Q Library
Javascript Promises/Q LibraryJavascript Promises/Q Library
Javascript Promises/Q Libraryasync_io
 
Understanding Asynchronous JavaScript
Understanding Asynchronous JavaScriptUnderstanding Asynchronous JavaScript
Understanding Asynchronous JavaScriptjnewmanux
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsPiotr Pelczar
 
Callbacks, promises, generators - asynchronous javascript
Callbacks, promises, generators - asynchronous javascriptCallbacks, promises, generators - asynchronous javascript
Callbacks, promises, generators - asynchronous javascriptŁukasz Kużyński
 
All you need to know about the JavaScript event loop
All you need to know about the JavaScript event loopAll you need to know about the JavaScript event loop
All you need to know about the JavaScript event loopSaša Tatar
 
Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.CocoaHeads France
 
Reactive cocoa made Simple with Swift
Reactive cocoa made Simple with SwiftReactive cocoa made Simple with Swift
Reactive cocoa made Simple with SwiftColin Eberhardt
 
ReactiveCocoa and Swift, Better Together
ReactiveCocoa and Swift, Better TogetherReactiveCocoa and Swift, Better Together
ReactiveCocoa and Swift, Better TogetherColin Eberhardt
 
How to send gzipped requests with boto3
How to send gzipped requests with boto3How to send gzipped requests with boto3
How to send gzipped requests with boto3Luciano Mammino
 
Fast C++ Web Servers
Fast C++ Web ServersFast C++ Web Servers
Fast C++ Web ServersTroy Miles
 
What's New in ES6 for Web Devs
What's New in ES6 for Web DevsWhat's New in ES6 for Web Devs
What's New in ES6 for Web DevsRami Sayar
 
Reactive Programming Patterns with RxSwift
Reactive Programming Patterns with RxSwiftReactive Programming Patterns with RxSwift
Reactive Programming Patterns with RxSwiftFlorent Pillet
 

Tendances (20)

Avoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promisesAvoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promises
 
Node Boot Camp
Node Boot CampNode Boot Camp
Node Boot Camp
 
An Introduction to Reactive Cocoa
An Introduction to Reactive CocoaAn Introduction to Reactive Cocoa
An Introduction to Reactive Cocoa
 
Javascript Promises/Q Library
Javascript Promises/Q LibraryJavascript Promises/Q Library
Javascript Promises/Q Library
 
Understanding Asynchronous JavaScript
Understanding Asynchronous JavaScriptUnderstanding Asynchronous JavaScript
Understanding Asynchronous JavaScript
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.js
 
Callbacks, promises, generators - asynchronous javascript
Callbacks, promises, generators - asynchronous javascriptCallbacks, promises, generators - asynchronous javascript
Callbacks, promises, generators - asynchronous javascript
 
All you need to know about the JavaScript event loop
All you need to know about the JavaScript event loopAll you need to know about the JavaScript event loop
All you need to know about the JavaScript event loop
 
Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.
 
ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
 
Reactive cocoa made Simple with Swift
Reactive cocoa made Simple with SwiftReactive cocoa made Simple with Swift
Reactive cocoa made Simple with Swift
 
ReactiveCocoa and Swift, Better Together
ReactiveCocoa and Swift, Better TogetherReactiveCocoa and Swift, Better Together
ReactiveCocoa and Swift, Better Together
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
How to send gzipped requests with boto3
How to send gzipped requests with boto3How to send gzipped requests with boto3
How to send gzipped requests with boto3
 
Fast C++ Web Servers
Fast C++ Web ServersFast C++ Web Servers
Fast C++ Web Servers
 
Présentation de HomeKit
Présentation de HomeKitPrésentation de HomeKit
Présentation de HomeKit
 
What's New in ES6 for Web Devs
What's New in ES6 for Web DevsWhat's New in ES6 for Web Devs
What's New in ES6 for Web Devs
 
Node.js - Best practices
Node.js  - Best practicesNode.js  - Best practices
Node.js - Best practices
 
Reactive Programming Patterns with RxSwift
Reactive Programming Patterns with RxSwiftReactive Programming Patterns with RxSwift
Reactive Programming Patterns with RxSwift
 
Introduction to es6
Introduction to es6Introduction to es6
Introduction to es6
 

En vedette

NSLogger - Cocoaheads Paris Presentation - English
NSLogger - Cocoaheads Paris Presentation - EnglishNSLogger - Cocoaheads Paris Presentation - English
NSLogger - Cocoaheads Paris Presentation - EnglishFlorent Pillet
 
Yhdessä oppimista verkossa
Yhdessä oppimista verkossaYhdessä oppimista verkossa
Yhdessä oppimista verkossaTiina Sarisalmi
 
Juliana New York
Juliana  New YorkJuliana  New York
Juliana New Yorkguest3c3576
 
Lunch Recipe from Romania
Lunch Recipe from RomaniaLunch Recipe from Romania
Lunch Recipe from RomaniaTiina Sarisalmi
 
One Source Solutions
One Source SolutionsOne Source Solutions
One Source Solutionsscaster
 
Formative Capitalism
Formative CapitalismFormative Capitalism
Formative CapitalismANM Farukh
 
Facebook
FacebookFacebook
FacebookJohanda
 
10 Forecasts Bangladesh Telco Industry
10 Forecasts Bangladesh Telco Industry10 Forecasts Bangladesh Telco Industry
10 Forecasts Bangladesh Telco IndustryANM Farukh
 
NCrafts.IO 2015 - Future of User eXperiences
NCrafts.IO 2015 - Future of User eXperiencesNCrafts.IO 2015 - Future of User eXperiences
NCrafts.IO 2015 - Future of User eXperiencesVincent Guigui
 
eTwinning - lyhyt johdatus työpajatyöskentelyyn
eTwinning - lyhyt johdatus työpajatyöskentelyyneTwinning - lyhyt johdatus työpajatyöskentelyyn
eTwinning - lyhyt johdatus työpajatyöskentelyynTiina Sarisalmi
 
Iside 26 05e Frodi Assicurazioni
Iside 26 05e Frodi AssicurazioniIside 26 05e Frodi Assicurazioni
Iside 26 05e Frodi AssicurazioniMarco Contini
 
Oriveden Keskuskoulu - Christmas Greeting from Preschool
Oriveden Keskuskoulu - Christmas Greeting from PreschoolOriveden Keskuskoulu - Christmas Greeting from Preschool
Oriveden Keskuskoulu - Christmas Greeting from PreschoolTiina Sarisalmi
 
Using Moodle to Support Differentiated Instruction
Using Moodle to Support Differentiated InstructionUsing Moodle to Support Differentiated Instruction
Using Moodle to Support Differentiated Instructionyeske.patricia
 

En vedette (20)

NSLogger - Cocoaheads Paris Presentation - English
NSLogger - Cocoaheads Paris Presentation - EnglishNSLogger - Cocoaheads Paris Presentation - English
NSLogger - Cocoaheads Paris Presentation - English
 
Thinking Reactive
Thinking ReactiveThinking Reactive
Thinking Reactive
 
MVVM & RxSwift
MVVM & RxSwiftMVVM & RxSwift
MVVM & RxSwift
 
Yhdessä oppimista verkossa
Yhdessä oppimista verkossaYhdessä oppimista verkossa
Yhdessä oppimista verkossa
 
Juliana New York
Juliana  New YorkJuliana  New York
Juliana New York
 
Lunch Recipe from Romania
Lunch Recipe from RomaniaLunch Recipe from Romania
Lunch Recipe from Romania
 
One Source Solutions
One Source SolutionsOne Source Solutions
One Source Solutions
 
Formative Capitalism
Formative CapitalismFormative Capitalism
Formative Capitalism
 
Facebook
FacebookFacebook
Facebook
 
10 Forecasts Bangladesh Telco Industry
10 Forecasts Bangladesh Telco Industry10 Forecasts Bangladesh Telco Industry
10 Forecasts Bangladesh Telco Industry
 
Twelve Gods of Olympus
Twelve Gods of OlympusTwelve Gods of Olympus
Twelve Gods of Olympus
 
NCrafts.IO 2015 - Future of User eXperiences
NCrafts.IO 2015 - Future of User eXperiencesNCrafts.IO 2015 - Future of User eXperiences
NCrafts.IO 2015 - Future of User eXperiences
 
Polish Cuisine Book
Polish Cuisine BookPolish Cuisine Book
Polish Cuisine Book
 
Welcome to Dywity
Welcome to DywityWelcome to Dywity
Welcome to Dywity
 
eTwinning - lyhyt johdatus työpajatyöskentelyyn
eTwinning - lyhyt johdatus työpajatyöskentelyyneTwinning - lyhyt johdatus työpajatyöskentelyyn
eTwinning - lyhyt johdatus työpajatyöskentelyyn
 
Iside 26 05e Frodi Assicurazioni
Iside 26 05e Frodi AssicurazioniIside 26 05e Frodi Assicurazioni
Iside 26 05e Frodi Assicurazioni
 
Exercici11.3
Exercici11.3Exercici11.3
Exercici11.3
 
Oriveden Keskuskoulu - Christmas Greeting from Preschool
Oriveden Keskuskoulu - Christmas Greeting from PreschoolOriveden Keskuskoulu - Christmas Greeting from Preschool
Oriveden Keskuskoulu - Christmas Greeting from Preschool
 
Ibiza Charter Boat: Sunseeker Predator 68 | THE DOER IBIZA. Bookings: + 34 63...
Ibiza Charter Boat: Sunseeker Predator 68 | THE DOER IBIZA. Bookings: + 34 63...Ibiza Charter Boat: Sunseeker Predator 68 | THE DOER IBIZA. Bookings: + 34 63...
Ibiza Charter Boat: Sunseeker Predator 68 | THE DOER IBIZA. Bookings: + 34 63...
 
Using Moodle to Support Differentiated Instruction
Using Moodle to Support Differentiated InstructionUsing Moodle to Support Differentiated Instruction
Using Moodle to Support Differentiated Instruction
 

Similaire à Introduction to reactive programming & ReactiveCocoa

Router Queue Simulation in C++ in MMNN and MM1 conditions
Router Queue Simulation in C++ in MMNN and MM1 conditionsRouter Queue Simulation in C++ in MMNN and MM1 conditions
Router Queue Simulation in C++ in MMNN and MM1 conditionsMorteza Mahdilar
 
Learn You a ReactiveCocoa for Great Good
Learn You a ReactiveCocoa for Great GoodLearn You a ReactiveCocoa for Great Good
Learn You a ReactiveCocoa for Great GoodJason Larsen
 
Reactive cocoa
Reactive cocoaReactive cocoa
Reactive cocoaiacisclo
 
Intro to ReactiveCocoa
Intro to ReactiveCocoaIntro to ReactiveCocoa
Intro to ReactiveCocoakleneau
 
Intro to React
Intro to ReactIntro to React
Intro to ReactTroy Miles
 
Don't Be Afraid of Abstract Syntax Trees
Don't Be Afraid of Abstract Syntax TreesDon't Be Afraid of Abstract Syntax Trees
Don't Be Afraid of Abstract Syntax TreesJamund Ferguson
 
Emerging Languages: A Tour of the Horizon
Emerging Languages: A Tour of the HorizonEmerging Languages: A Tour of the Horizon
Emerging Languages: A Tour of the HorizonAlex Payne
 
Complex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxComplex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxbobmcwhirter
 
The Evolution of Async-Programming (SD 2.0, JavaScript)
The Evolution of Async-Programming (SD 2.0, JavaScript)The Evolution of Async-Programming (SD 2.0, JavaScript)
The Evolution of Async-Programming (SD 2.0, JavaScript)jeffz
 
React Development with the MERN Stack
React Development with the MERN StackReact Development with the MERN Stack
React Development with the MERN StackTroy Miles
 
Background Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRbBackground Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRbJuan Maiz
 
Server side JavaScript: going all the way
Server side JavaScript: going all the wayServer side JavaScript: going all the way
Server side JavaScript: going all the wayOleg Podsechin
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)jeffz
 

Similaire à Introduction to reactive programming & ReactiveCocoa (20)

Router Queue Simulation in C++ in MMNN and MM1 conditions
Router Queue Simulation in C++ in MMNN and MM1 conditionsRouter Queue Simulation in C++ in MMNN and MM1 conditions
Router Queue Simulation in C++ in MMNN and MM1 conditions
 
Cpp tutorial
Cpp tutorialCpp tutorial
Cpp tutorial
 
CppTutorial.ppt
CppTutorial.pptCppTutorial.ppt
CppTutorial.ppt
 
Lambdas puzzler - Peter Lawrey
Lambdas puzzler - Peter LawreyLambdas puzzler - Peter Lawrey
Lambdas puzzler - Peter Lawrey
 
Learn You a ReactiveCocoa for Great Good
Learn You a ReactiveCocoa for Great GoodLearn You a ReactiveCocoa for Great Good
Learn You a ReactiveCocoa for Great Good
 
Reactive cocoa
Reactive cocoaReactive cocoa
Reactive cocoa
 
Intro to ReactiveCocoa
Intro to ReactiveCocoaIntro to ReactiveCocoa
Intro to ReactiveCocoa
 
Intro to React
Intro to ReactIntro to React
Intro to React
 
Profiling Ruby
Profiling RubyProfiling Ruby
Profiling Ruby
 
Day 1
Day 1Day 1
Day 1
 
MLflow with R
MLflow with RMLflow with R
MLflow with R
 
Don't Be Afraid of Abstract Syntax Trees
Don't Be Afraid of Abstract Syntax TreesDon't Be Afraid of Abstract Syntax Trees
Don't Be Afraid of Abstract Syntax Trees
 
Emerging Languages: A Tour of the Horizon
Emerging Languages: A Tour of the HorizonEmerging Languages: A Tour of the Horizon
Emerging Languages: A Tour of the Horizon
 
Complex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxComplex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBox
 
The Evolution of Async-Programming (SD 2.0, JavaScript)
The Evolution of Async-Programming (SD 2.0, JavaScript)The Evolution of Async-Programming (SD 2.0, JavaScript)
The Evolution of Async-Programming (SD 2.0, JavaScript)
 
React Development with the MERN Stack
React Development with the MERN StackReact Development with the MERN Stack
React Development with the MERN Stack
 
Background Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRbBackground Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRb
 
Server side JavaScript: going all the way
Server side JavaScript: going all the wayServer side JavaScript: going all the way
Server side JavaScript: going all the way
 
Wider than rails
Wider than railsWider than rails
Wider than rails
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
 

Dernier

Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfryanfarris8
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplatePresentation.STUDIO
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park masabamasaba
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrandmasabamasaba
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionOnePlan Solutions
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfproinshot.com
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfonteinmasabamasaba
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfayushiqss
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is insideshinachiaurasa2
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech studentsHimanshiGarg82
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...Nitya salvi
 

Dernier (20)

Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
 

Introduction to reactive programming & ReactiveCocoa