Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Slide de Promises par Pierre de la Morinerie

3,681 views

Published on

  • Be the first to comment

  • Be the first to like this

Slide de Promises par Pierre de la Morinerie

  1. 1. Les Promesses Une introduction aux Promesses en Objective-C
  2. 2. Un design pattern
  3. 3. Blocks
  4. 4. Blocks
  5. 5. Callback hell :(
  6. 6. Les Promesses : origine • « The Impact of Applicative Programming on Multiprocessing »
 Daniel P. Friedman and David Wise, 1976 • Parfois appelées Futures, Deferred ou Tasks
  7. 7. Encore un truc ésotérique ? LISP Haskell Erlang
  8. 8. Pas trop, non. C#
  9. 9. Une Promesse • Un objet qui représente une valeur à venir • Des callbacks pour réagir aux changements
  10. 10. Déclaration @interface Promise : NSObject { id _value; id (^)(id value) _onFulfilled; id (^)(id reason) _onRejected; } ! ! ! ! ! @end
  11. 11. Déclaration @interface Promise : NSObject { id _value; id (^)(id value) _onFulfilled; id (^)(id reason) _onRejected; } ! ! (Promise*)thenOnFulfilled:(^…)onFulFilled ! onRejected:(^…)onRejected ! (void)resolve(id value); ! @end
  12. 12. Utilisation [[self retrieveDataAsync] thenOnFulfilled:(id(^)(id value) { // do something with value } onRejected:(id(^)(id reason) { // present the error }];
  13. 13. Quel intérêt ? • Réifier les callbacks • Standardiser les callbacks les rendre manipulables
  14. 14. Trois intérêts pratiques 1. Simplifier les signatures des méthodes 2. Chaîner les callbacks 3. Tester le code asynchrone
  15. 15. Exemple • navitia.io • Récupérer une liste de lieux en JSON
  16. 16. 1. Simplifier les signatures Sans Promesses : @interface NavitiaClient : NSObject ! - (void) placesForQuery:(NSString*)query completion:(void (^)(id jsonObject, NSError *error)) completionBlock; ! @end
  17. 17. 1. Simplifier les signatures Avec Promesses : @interface NavitiaClient : NSObject ! - (Promise*) placesForQuery:(NSString*)query; ! @end
  18. 18. 2. Chaîner les callbacks Sans Promesses : // 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 } }];
  19. 19. 2. Chaîner les callbacks Avec Promesses : // 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 }];
  20. 20. 3.Tester le code asynchrone Sans Promesses : // 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);
  21. 21. 3.Tester le code asynchrone Avec Promesses : // ViewControllerTests.m ! [[[navitiaClientMock stub] andResolvePromiseWithValue:placesFixture] placesForQuery:@"foo"]; ! [viewController updatePlacesWithQuery:@"foo"]; ! STAssertEqualObjects(viewController.places, placesFixture, nil);
  22. 22. Démo github.com/kemenaran/Rebelle
  23. 23. Références Introduction aux Promesses (en Javascript)! • http://blog.parse.com/2013/01/29/whats-so-great-about-javascriptpromises/ • http://fr.slideshare.net/domenicdenicola/callbacks-promises-andcoroutines-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#)
  24. 24. Au fait…
  25. 25. www.capitainetrain.com

×