我正在观看来自WWDC的并发编程讲话,found here我对async的含义有点困惑。在Javascript世界中,我们使用“async”来描述“乱序”或实际上发生的进程,这些进程在下一行代码执行之前无法保证返回。然而,在本次演讲中,演示者演示的内容似乎是一系列任务一个接一个地执行(即同步行为)
然后在这个代码示例中
Creating a new cordova project with name "HelloWorld" and id "com.example.hello" at location "~/Downloads"
Downloading cordova library for www...
Error: HTTP error 404 retrieving version 3.6.3 of cordova for www
at Request._callback (~/.nvm/v0.10.48/lib/node_modules/cordova/node_modules/cordova-lib/src/cordova/lazy_load.js:230:30)
at Request.self.callback (~/.nvm/v0.10.48/lib/node_modules/cordova/node_modules/cordova-lib/node_modules/request/index.js:148:22)
at Request.emit (events.js:98:17)
at Request.<anonymous> (~/.nvm/v0.10.48/lib/node_modules/cordova/node_modules/cordova-lib/node_modules/request/index.js:886:14)
at Request.emit (events.js:117:20)
at IncomingMessage.<anonymous> (~/.nvm/v0.10.48/lib/node_modules/cordova/node_modules/cordova-lib/node_modules/request/index.js:837:12)
at IncomingMessage.emit (events.js:117:20)
at _stream_readable.js:944:16
at process._tickCallback (node.js:458:13)
这个let queue = DispatchQueue(label: "com.example.imagetransform")
queue.async {
let smallImage = image.resize(to: rect)
DispatchQueue.main.async {
imageView.image = smallImage
}
}
似乎看起来不像它应该乍一看的FIFO数据结构。我看到他们正在将闭包传递给DispatchQueue
方法,但我不确定如何添加更多的块或任务来执行它。
我猜这个queue.async
的性质类似于Javascript回调,因为闭包中分配的所有变量只限于该闭包,我们只能在闭包内对该数据进行操作
答案 0 :(得分:2)
DispatchQueues是关于任务的 start 的FIFO。如果它们是并发队列,或者您正在提交异步任务,那么当它们完成
时就没有FIFO保证并发队列允许多个任务同时运行。保证任务按照添加顺序开始。任务可以按任何顺序完成,您不知道下一个任务启动所需的时间,也不知道在任何给定时间运行的任务数。 - https://www.raywenderlich.com/148513/grand-central-dispatch-tutorial-swift-3-part-1