DGTAsync was inspired by duemunk/Async. But it was written from the ground up to be able to handle an async tasks such as Alamofire download/upload tasks. It also can handle errors and parallel tasks.
pod 'DGTAsync'
import DGTAsync
Every DGTAsync tasks (blocks) have to accept one cb
parameter which is a async_done_callback
type.
And then, when the tasks finished you have to call cb(nil)
to let DGTAsync know that your tasks have done.
DGTAsync.background { cb in
self.syncTask()
cb(nil)
}
Just call the cb(nil)
when the tasks done.
DGTAsync.background { cb in
self.asyncTask(cb)
}
func asyncTask(cb: async_done_callback) {
self.doSomethingWithCompletionHandler {
cb(nil)
}
}
You can do chaining asynchronous tasks synchronously.
DGTAsync.background { cb in
self.asyncTask(cb)
}.background { cb in
// Enter here only after asyncTask done
self.syncTask()
cb(nil)
}.main { cb in
// Enter here only after syncTask done (because we put cb(nil) after it, make sense?)
self.doSomethingInMainQueue()
cb(nil)
}
You can use .err
to register an error handler. And you can pass a NSError object to the cb
like cb(error)
.
When the NSError object is passed to the cb
DGTAsync will skip all the chains and go right straight to the .err
handler.
DGTAsync.background { cb in
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
.response { (request, response, data, error) in
cb(error)
}
}.background { cb in
// This block will be skipped if the request has error
self.doSomethingAfterGetResponse()
cb(nil)
}.main { cb in
// This block also will be skipped if the request has error
self.updateUI()
cb(nil)
}.err { error in
println("Request Error: \(error.localizedDescription)")
}
DGTAsync can also handle parallel tasks (but BEWARE about race condition and deadlock. YOU HAVE BEEN WARNED!)
When working with parallel tasks you have to work with another set of DGTAsync API that every methods have been prefixed with p
. There are pbackground
, pmain
and pdone
that will let you know when your tasks have done.
All tasks will begin execute just right after you call pbackground
or pmain
they don't wait anything.
The example below demonstrate how to parallel upload multiple files and know when they are done.
DGTAsync.pbackground { cb in
Alamofire.upload(.POST, "http://server.com/upload", file: fileURL1)
.responseJSON { (request, response, data, error) in
cb(error)
}
}.pbackground { cb in
Alamofire.upload(.POST, "http://server.com/upload", file: fileURL2)
.responseJSON { (request, response, data, error) in
cb(error)
}
}.pbackground { cb in
Alamofire.upload(.POST, "http://server.com/upload", file: fileURL3)
.responseJSON { (request, response, data, error) in
cb(error)
}
}.pdone {
println("All files have been uploaded.")
}
DGTAsync is released under the MIT license. See LICENSE for details.