/PromiseKit

A delightful Promises implementation for iOS and OS X

Primary LanguageObjective-CMIT LicenseMIT

Modern development is highly asynchronous: isn’t it about time iOS developers had tools that made programming asynchronously powerful, easy and delightful?

[CLLocationManager promise].catch(^{
    return self.chicagoLocation;
}).then(^(CLLocation *loc){
    return [NSURLConnection GET:@"http://user.net/%f/%f", loc.latitude, loc.longitude];
}).then(^(NSDictionary *user){
    UIAlertView *alert = [UIAlertView new];
    alert.title = [NSString stringWithFormat:@"Hi, %@!", user.name];
    [alert addButtonWithTitle:@"Bye"];
    [alert addButtonWithTitle:@"Hi!"];
    return alert.promise;
}).then(^(NSNumber *tappedButtonIndex, UIAlertView *alert){
    if (tappedButtonIndex.intValue == alert.cancelButtonIndex)
        return nil;
    id vc = [HelloViewController new]
    return [self promiseViewController:vc animated:YES completion:nil].then(^(id resultFromViewController){
        //
    });
}).catch(^(NSError *err){
    //
});
  • PromiseKit can and should be integrated into the other Pods you use.
  • PromiseKit is complete, well-tested and in apps on the store.

For guides and complete documentation visit promisekit.org.

#Swift

To test the waters, PromiseKit is available as a Swift variant. If you want to use it in your app then drag and drop swift/PromiseKit.xcodeproj into your project.

Currently the Swift and Objective-C versions are indepenedent. We hope to fix that as Xcode 6 matures.

We provide a demo project for the Swift version, just open the provided xcodeproj.

Please be aware that (much like the language) the Swift version is a work in progress.

CLLocationManager.promise().catch {
    // If location cannot be determined, default to Chicago
    return CLLocation(latitude: 41.89, longitude: -87.63)
}.then {
    let (lat, lon) = ($0.coordinate.latitude, $0.coordinate.longitude)
    return NSURLConnection.GET("http://user.net/\(lat)/\(lon)")
}.then { (user:NSDictionary) in
    let alert = UIAlertView()
    alert.title = "Hi " + user["name"]
    alert.addButtonWithTitle("Bye")
    alert.addButtonWithTitle("Hi")
    return alert.promise()
}.then { [unowned self] tappedButtonIndex -> Promise<Void>? in
    if tappedButtonIndex == 0 {
        return nil
    }
    let vc = HelloViewController()
    return self.promiseViewController(vc).then { (modallyPresentedResult:String) -> Void in
        //…
    }
}.catch { error in
    //…
}