25
Les Promesses Une introduction aux Promesses en Objective-C

Slide de Promises par Pierre de la Morinerie

Embed Size (px)

Citation preview

Page 1: Slide de Promises par Pierre de la Morinerie

Les PromessesUne introduction aux Promesses en Objective-C

Page 2: Slide de Promises par Pierre de la Morinerie

Un design pattern

Page 3: Slide de Promises par Pierre de la Morinerie

Blocks

Page 4: Slide de Promises par Pierre de la Morinerie

Blocks

Page 5: Slide de Promises par Pierre de la Morinerie

Callback hell :(

Page 6: Slide de Promises par Pierre de la Morinerie

Les Promesses : origine

• « The Impact of Applicative Programming on Multiprocessing »Daniel P. Friedman and David Wise, 1976

• Parfois appelées Futures, Deferred ou Tasks

Page 7: Slide de Promises par Pierre de la Morinerie

LISP

Haskell

Erlang

Encore un truc ésotérique ?

Page 8: Slide de Promises par Pierre de la Morinerie

C#

Pas trop, non.

Page 9: Slide de Promises par Pierre de la Morinerie

Une Promesse

• Un objet qui représente une valeur à venir

• Des callbacks pour réagir aux changements

Page 10: Slide de Promises par Pierre de la Morinerie

@interface Promise : NSObject { id _value; id (^)(id value) _onFulfilled; id (^)(id reason) _onRejected; } !!!!!@end

Déclaration

Page 11: Slide de Promises par Pierre de la Morinerie

@interface Promise : NSObject { id _value; id (^)(id value) _onFulfilled; id (^)(id reason) _onRejected; } !!!!!@end

Déclaration

- (Promise*)thenOnFulfilled:(^…)onFulFilled onRejected:(^…)onRejected - (void)resolve(id value);

Page 12: Slide de Promises par Pierre de la Morinerie

[[self retrieveDataAsync] thenOnFulfilled:(id(^)(id value) { // do something with value } onRejected:(id(^)(id reason) { // present the error }];

Utilisation

Page 13: Slide de Promises par Pierre de la Morinerie

Quel intérêt ?

• Réifier les callbacks

• Standardiser les callbacks⇒ les rendre

manipulables

Page 14: Slide de Promises par Pierre de la Morinerie

Trois intérêts pratiques

1. Simplifier les signatures des méthodes

2. Chaîner les callbacks

3. Tester le code asynchrone

Page 15: Slide de Promises par Pierre de la Morinerie

Exemple

• navitia.io

• Récupérer une liste de lieux en JSON

Page 16: Slide de Promises par Pierre de la Morinerie

1. Simplifier les signatures

@interface NavitiaClient : NSObject !- (void) placesForQuery:(NSString*)query completion:(void (^)(id jsonObject, NSError *error)) completionBlock; !@end

Sans Promesses :

Page 17: Slide de Promises par Pierre de la Morinerie

1. Simplifier les signatures

@interface NavitiaClient : NSObject !- (Promise*) placesForQuery:(NSString*)query; !@end

Avec Promesses :

Page 18: Slide de Promises par Pierre de la Morinerie

2. Chaîner les callbacks// ViewController.m ![_navitiaClient placesForQuery:text completion:^(NSArray *places, NSError *error) { if (!error) { [_navitiaClient coordinatesForPlaces:places completion:^(NSArray *coordinates, NSError *error2) { if (!error2) { // display places coordinates } else { // handle error2 } } } else { // handle error } }];

Sans Promesses :

Page 19: Slide de Promises par Pierre de la Morinerie

2. Chaîner les callbacks// ViewController.m ![[[_navitiaClient placesForQuery:text] ! thenOnFulfilled:(id(^)(NSArray *places) { return [_navitiaClient coordinatesForPlaces:places]; }] ! thenOnFulfilled:(id(^)(NSArray *coordinates) { // display places coordinates } ! onRejected:(id(^)(NSError *error) { // handle error }];

Avec Promesses :

Page 20: Slide de Promises par Pierre de la Morinerie

3.Tester le code asynchrone

// ViewControllerTests.m ![[[navitiaClientMock stub] andDo:^(NSInvocation *inv) { id (^completion)(NSArray *, NSError *); [inv getArgument:&completion atIndex:3]; completion(placesFixture, nil); }] placesForQuery:@"foo" completion:OCMARG_ANY]; ![viewController updatePlacesWithQuery:@"foo"]; !STAssertEqualObjects(viewController.places, placesFixture, nil);

Sans Promesses :

Page 21: Slide de Promises par Pierre de la Morinerie

3.Tester le code asynchrone

// ViewControllerTests.m ![[[navitiaClientMock stub] andResolvePromiseWithValue:placesFixture] placesForQuery:@"foo"]; ![viewController updatePlacesWithQuery:@"foo"]; !STAssertEqualObjects(viewController.places, placesFixture, nil);

Avec Promesses :

Page 22: Slide de Promises par Pierre de la Morinerie

Démogithub.com/kemenaran/Rebelle

Page 23: Slide de Promises par Pierre de la Morinerie

RéférencesIntroduction aux Promesses (en Javascript)!• http://blog.parse.com/2013/01/29/whats-so-great-about-javascript-

promises/ • http://fr.slideshare.net/domenicdenicola/callbacks-promises-and-

coroutines-oh-my-the-evolution-of-asynchronicity-in-javascript

Implémentations!• https://github.com/kemenaran/Rebelle • https://github.com/mproberts/objc-promise • https://github.com/ReactiveCocoa/ReactiveCocoa

Concepts ou langages similaires!• https://github.com/nevyn/SPAsync (inspiré de C#)

Page 24: Slide de Promises par Pierre de la Morinerie

Au fait…

Page 25: Slide de Promises par Pierre de la Morinerie

www.capitainetrain.com