Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa
-
Upload
backelite -
Category
Technology
-
view
265 -
download
0
Transcript of Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa
![Page 1: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/1.jpg)
LA PROGRAMMATION RÉACTIVE SUR IOS
RÉACTIVE COCOA
Nicolas Fontaine - CocoaHeads Montpellier - 12/05/2016
![Page 2: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/2.jpg)
QU’EST-CE QUE C’EST QUE CE TRUC ?
Parlons design pattern :
La programmation réactive est née d’une utilisation avancée du pattern : « Observable / Observer ».
Intégré à notre beau SDK iOS nous avons les NSNotification qui utilisent ce pattern « Observable / Observer ». Mais admettons le… ce n’est pas suffisant et la plupart du temps quand on les utilises on se cache derrière le fameux :
2
Ouai c’est pas beau mais c’est pratique !
« C’est pas beau mais c’est pratique, attention à cette phrase quand même »
Florence Foresti
![Page 3: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/3.jpg)
BACKELITE
LA PROGRAMMATION RÉACTIVE
8 FÉVRIER 2016 3
Paradigme de programmation autour de flux de données et propagations du changement.
Cas d’utilisation classique :
Appels à des WebServices
Traitements de données asynchrones
Développement basé sur la notion d’évènement (très utile dans le mobile)
Gestion d’entrées utilisateur (UI)
S’oppose directement à une programmation « Bloquante » consommant beaucoup de mémoire.
Pattern architectural MVVM
![Page 4: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/4.jpg)
BACKELITE
LA PROGRAMMATION RÉACTIVE : SUBSCRIPTION
8 FÉVRIER 2016 4
Observable (signal)
Observer
SubscribeNext
SubscribeCompleted SubscribeError
![Page 5: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/5.jpg)
BACKELITE
LA PROGRAMMATION RÉACTIVE : REACTIVITY
8 FÉVRIER 2016 5
Observable (signal)
Observer
Next (value)
Completed
![Page 6: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/6.jpg)
BACKELITE
REACTIVE COCOA
8 FÉVRIER 2016 6
En réactive Cocoa, l’observable est qualifié de « Signal »
Exemple de création d’un signal :
S’abonner à ce signal:
![Page 7: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/7.jpg)
BACKELITE
REACTIVE COCOA
8 FÉVRIER 2016 7
Types de signaux principaux :
Eagerly : Démarre dès qu’instancié (par défaut)
RACSignal *eagerSignal = [RACSignal startEagerlyWithScheduler:[RACScheduler schedulerWithPriority:RACSchedulerPriorityBackground] block:^(id <RACSubscriber> subscriber) {
Lazily : Démarre dès qu’écouté
RACSignal *lazySignal = [RACSignal startLazilyWithScheduler:[RACScheduler schedulerWithPriority:RACSchedulerPriorityBackground] block:^(id <RACSubscriber> subscriber) {
![Page 8: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/8.jpg)
FLUX DE DONNÉES
Exemple :
[self showWaitingView]; RACSignal *purchaseListSignal = [[SomeManager sharedManager] retreivePurchases];[purchaseListSignal subscribeNext:^(NSArray *purchases) { self.purchasesArray = purchases; [self reloadTableView]; } error:^(NSError *error) { if (![self handleError:error]) { [self showErrorMessage:error]; } self.purchasesArray = @[]; [self reloadTableView]; [self hideWaitingView]; } completed:^{ [self hideWaitingView]; }];
8
Recevoir des données via le « Next »
Imaginez un viewController qui veut récupérer en ligne une liste d’achats effectués par un client
![Page 9: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/9.jpg)
JOUER AVEC LES SIGNAUX : LES OPÉRATEURS DE TRANSFORMATION MAP, FLATTENMAP, THEN, CATCH…
9
Map : Permet d’intervenir sur la valeur de la donnée transmise par un « sendNext » dans un signal
FlattenMap : Permet de « dérouter » un next en utilisant un nouveau signal
Signal Original
Signal map
3
Error
flattenMap : si x est impair alors le signal devient un signal d’erreur
![Page 10: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/10.jpg)
JOUER AVEC LES SIGNAUX : LES OPÉRATEURS COMBINATOIRES CONCAT, MERGE, SAMPLE, COMBINELATEST
10
Concat : Permet de séquencer des signaux en un seul signal dont les « next » sont ceux des signaux qui le composent et où une erreur arrête la séquence. Un concat envoie « completed » quand le dernier de ses « sous signaux » l’aura fait.
Merge : Même principe que le concat mais en parallelisant cette fois les signaux.
![Page 11: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/11.jpg)
JOUER AVEC LES SIGNAUX : LES OPÉRATEURS SONT NOMBREUX !!!!
11
Opérateurs de filtre :
filter, skip, distinct, first, last…
Opérateurs mathématiques :
average, count, max, min, reduce, sum…
Opérateurs booléens :
every, some, includes…
![Page 12: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/12.jpg)
REACTIVE COCOA SUR L’UI
12
Reactive cocoa vient avec beaucoup de catégories sur des classes d’UI.
Par exemple, les textfields. Où l’on pourra sortir un signal nous permettant de recevoir dans un « next » le text tapé à chaque nouveau caractère. Une élégante alternative aux méthodes delegates.
![Page 13: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/13.jpg)
EXEMPLES D’UTILISATION SUR L’UI :
13
Sur un bouton :
[[self.aButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) { NSLog(@"button clicked"); }];
Sur un textfield :
[[self.aTextField.rac_textSignal map:^id(NSString *text) { return @(text.length); }] subscribeNext:^(NSNumber *length) { NSLog(@"%@", length); self.aTextField.textColor = (length.integerValue > 5) ? [UIColor greenColor] : [UIColor blackColor]; }]; }
![Page 14: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/14.jpg)
LES SCHEDULERS
14
Un signal possède un « scheduler »
A la création d’un signal, le scheduler par défaut est sur le thread courant.
Dans le cas d’une utilisation d’un scheduler « background », il faut faire bien attention aux répercutions côté UI.
Si le subscriber se trouve être sur l’UI, il ne faudra pas oublier d’employer l’opérateur : « DeliverOnMainThread » afin que tout changements faits à l’UI dans les block next/error/completed se répercutent directement sur l’interface.
![Page 15: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/15.jpg)
LES TESTS UNITAIRES ET REACTIVE COCOA
15
C’est possible mais… C’est moche pas très élégant.
En effet on devra utiliser une méthode sur un signal pour « bloquer » la suite du test jusqu’à ce que ce signal soit terminé.
[historySignal waitUntilCompleted:error]; XCAssertTrue(quelquechose);
![Page 16: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/16.jpg)
REACTIVE COCOA EST AUJOURD’HUI EN VERSION 4.1 MAIS LA DERNIÈRE VERSION COMPATIBLE AVEC IOS 7 EST LA 2.5
RXSWIFT SEMBLE S’IMPOSER COMME LA LIBRAIRIE ÉQUIVALENTE POUR LE NOUVEAU LANGAGE DE LA
POMME
Nota Bene
![Page 17: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/17.jpg)
AVANT DE PASSER À UN EXEMPLE…
DES QUESTIONS ?
![Page 18: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/18.jpg)
EXEMPLE DE CODE :
18
UN ENCHAÎNEMENT PARTICULIER D’APPELS WEBSERVICES AVEC UNE PROGRESS BAR
![Page 19: Cocoaheads Montpellier Meetup : La programmation réactive sur iOS avec Réactive Cocoa](https://reader034.fdocument.pub/reader034/viewer/2022051300/58789cd01a28ab42588b4b77/html5/thumbnails/19.jpg)
HTTPS://WWW.RAYWENDERLICH.COM/62699/REACTIVECOCOA-TUTORIAL-PT1
LIENS UTILES
HTTP://RXMARBLES.COM
HTTPS://GITHUB.COM/REACTIVECOCOA/REACTIVECOCOA