DGTAsync 受 duemunk/Async 的启发。但它从头开始编写,以便能够处理像 Alamofire 的下载/上传任务这样的异步任务。它还可以处理错误和并行任务。
import DGTAsync
每个 DGTAsync 任务(块)都必须接受一个 cb
参数,它是一个 async_done_callback
类型的参数。然后,当任务完成时,您必须调用 cb(nil)
以通知 DGTAsync 任务已完成。
DGTAsync.background { cb in
self.syncTask()
cb(nil)
}
仅当任务完成时调用 cb(nil)
。
DGTAsync.background { cb in
self.asyncTask(cb)
}
func asyncTask(cb: async_done_callback) {
self.doSomethingWithCompletionHandler {
cb(nil)
}
}
您可以对异步任务进行同步链式调用。
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)
}
您可以使用 .err
注册一个错误处理程序。并且您可以将 NSError 对象传递给 cb
,如 cb(error)
。当 NSError 对象传递给 cb
时,DGTAsync 将跳过所有链式调用,直接转到 .err
处理程序。
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 还可以处理并行任务(但请注意竞争条件和死锁的风险。警告过您了!)
当处理并行任务时,您必须使用另一组 DGTAsync API,其中每个方法都被 p
前缀修饰。有 pbackground
、pmain
和 pdone
,这将通知您任务已完成。
所有任务将在您调用 pbackground
或 pmain
后立即开始执行,不会等待任何事情。
下面的示例演示了如何并行上传多个文件并知道它们何时完成。
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 在 MIT 许可下发布。有关详情,请参阅 LICENSE。