Contenu connexe Plus de CocoaHeads France Plus de CocoaHeads France (20) Slide de Promises par Pierre de la Morinerie6. Les Promesses : origine
•
« The Impact of Applicative Programming on
Multiprocessing »
Daniel P. Friedman and David Wise, 1976
•
Parfois appelées Futures, Deferred ou Tasks
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
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);
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#)