Slide de Promises par Pierre de la Morinerie

3,425 views
3,334 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
3,425
On SlideShare
0
From Embeds
0
Number of Embeds
2,986
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

×