Promises simplify asynchronous programming, freeing you up to focus on the more important things. They are easy to learn, easy to master and result in clearer, more readable code. Your co-workers will thank you.
UIApplication.shared.isNetworkActivityIndicatorVisible = true
firstly {
when(URLSession.dataTask(with: url).asImage(), CLLocationManager.promise())
}.then { image, location -> Void in
self.imageView.image = image
self.label.text = "\(location)"
}.always {
UIApplication.shared.isNetworkActivityIndicatorVisible = false
}.catch { error in
self.show(UIAlertController(for: error), sender: self)
}
PromiseKit is a thoughtful and complete implementation of promises for any
platform with a swiftc
, it has excellent Objective-C bridging and
delightful specializations for iOS, macOS, tvOS and watchOS. It is a top-100
pod used in many of the most popular apps in the world.
In your Podfile:
use_frameworks!
target "Change Me!" do
pod "PromiseKit", "~> 4.4"
end
PromiseKit 4 and 5 support Xcode 8.1, 8.2, 8.3 and 9.0; Swift 3.0, 3.1, 3.2 and 4.0; iOS, macOS, tvOS, watchOS, Linux and Android; CocoaPods, Carthage and SwiftPM; (CI Matrix).
For Carthage, SwiftPM, etc., or for instructions when using older Swifts or Xcodes see our Installation Guide.
PromiseKit 5 has been released, but is not yet fully documented, so we advise sticking with version 4 for the time being.
- Handbook
- Manual
- Installation Guide
- Objective-C Guide
- Troubleshooting (eg. solutions to common compile errors)
- Appendix
If you are looking for a function’s documentation, then please note our sources are thoroughly documented.
Promises are only as useful as the asynchronous tasks they represent, thus we
have converted (almost) all of Apple’s APIs to promises. By default PromiseKit
only provides promises, the extensions are available by specifying additional
subspecs in your Podfile
, eg:
pod "PromiseKit/MapKit" # MKDirections().calculate().then { /*…*/ }
pod "PromiseKit/CoreLocation" # CLLocationManager.requestLocation().then { /*…*/ }
All our extensions are separate repositories at the PromiseKit organization.
Promise chains are commonly started with networking, thus we offer multiple
options: Alamofire, OMGHTTPURLRQ and of course (vanilla) NSURLSession
:
// pod 'PromiseKit/Alamofire'
// https://github.com/PromiseKit/Alamofire
Alamofire.request("http://example.com", method: .post).responseJSON().then { json in
//…
}.catch { error in
//…
}
// pod 'PromiseKit/OMGHTTPURLRQ'
// https://github.com/PromiseKit/OMGHTTPURLRQ
URLSession.POST("http://example.com").asDictionary().then { json in
//…
}.catch { error in
//…
}
// pod 'PromiseKit/Foundation'
// https://github.com/PromiseKit/Foundation
URLSession.shared.dataTask(url).asDictionary().then { json in
// …
}.catch { error in
//…
}
Nobody ever got fired for using Alamofire, but at the end of the day, it’s
just a wrapper around NSURLSession
. OMGHTTPURLRQ supplements
NSURLRequest
to make generating REST style requests easier, and the PromiseKit
extensions extend NSURLSession
to make OMG usage more convenient. But since a
while now most servers accept JSON, so writing a simple API class that uses
vanilla NSURLSession
and our promises is not hard, and gives you the most
control with the fewest black-boxes.
The choice is yours.
Ask your question at our Gitter chat channel or on our bug tracker.