Your SlideShare is downloading. ×
0
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Slide de Promises par Pierre de la Morinerie
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Slide de Promises par Pierre de la Morinerie

3,169

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,169
On Slideshare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Les Promesses Une introduction aux Promesses en Objective-C
  • 2. Un design pattern
  • 3. Blocks
  • 4. Blocks
  • 5. Callback hell :(
  • 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. Encore un truc ésotérique ? LISP Haskell Erlang
  • 8. Pas trop, non. C#
  • 9. Une Promesse • Un objet qui représente une valeur à venir • Des callbacks pour réagir aux changements
  • 10. Déclaration @interface Promise : NSObject { id _value; id (^)(id value) _onFulfilled; id (^)(id reason) _onRejected; } ! ! ! ! ! @end
  • 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. Utilisation [[self retrieveDataAsync] thenOnFulfilled:(id(^)(id value) { // do something with value } onRejected:(id(^)(id reason) { // present the error }];
  • 13. Quel intérêt ? • Réifier les callbacks • Standardiser les callbacks les rendre manipulables
  • 14. Trois intérêts pratiques 1. Simplifier les signatures des méthodes 2. Chaîner les callbacks 3. Tester le code asynchrone
  • 15. Exemple • navitia.io • Récupérer une liste de lieux en JSON
  • 16. 1. Simplifier les signatures Sans Promesses : @interface NavitiaClient : NSObject ! - (void) placesForQuery:(NSString*)query completion:(void (^)(id jsonObject, NSError *error)) completionBlock; ! @end
  • 17. 1. Simplifier les signatures Avec Promesses : @interface NavitiaClient : NSObject ! - (Promise*) placesForQuery:(NSString*)query; ! @end
  • 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. 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. 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. 3.Tester le code asynchrone Avec Promesses : // ViewControllerTests.m ! [[[navitiaClientMock stub] andResolvePromiseWithValue:placesFixture] placesForQuery:@"foo"]; ! [viewController updatePlacesWithQuery:@"foo"]; ! STAssertEqualObjects(viewController.places, placesFixture, nil);
  • 22. Démo github.com/kemenaran/Rebelle
  • 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. Au fait…
  • 25. www.capitainetrain.com

×