DGTAsync 1.1.1

DGTAsync 1.1.1

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布上次发布2015年5月
SPM支持 SPM

0angelic0 维护。



DGTAsync 1.1.1

  • 作者
  • 0angelic0

DGTAsync

DGTAsync 受 duemunk/Async 的启发。但它从头开始编写,以便能够处理像 Alamofire 的下载/上传任务这样的异步任务。它还可以处理错误和并行任务。

用法

import DGTAsync

基础

每个 DGTAsync 任务(块)都必须接受一个 cb 参数,它是一个 async_done_callback 类型的参数。然后,当任务完成时,您必须调用 cb(nil) 以通知 DGTAsync 任务已完成。

DGTAsync.background { cb in
  self.syncTask()
  cb(nil)
}

DGTAsync 中的异步任务执行

仅当任务完成时调用 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)
}

处理错误(NSError)

您可以使用 .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 前缀修饰。有 pbackgroundpmainpdone,这将通知您任务已完成。

所有任务将在您调用 pbackgroundpmain 后立即开始执行,不会等待任何事情。

下面的示例演示了如何并行上传多个文件并知道它们何时完成。

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。