DispatchQueue中异步的含义

时间:2018-03-29 20:21:12

标签: swift

我正在观看来自WWDC的并发编程讲话,found here我对async的含义有点困惑。在Javascript世界中,我们使用“async”来描述“乱序”或实际上发生的进程,这些进程在下一行代码执行之前无法保证返回。然而,在本次演讲中,演示者演示的内容似乎是一系列任务一个接一个地执行(即同步行为)

enter image description here

然后在这个代码示例中

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回调,因为闭包中分配的所有变量只限于该闭包,我们只能在闭包内对该数据进行操作

1 个答案:

答案 0 :(得分:2)

DispatchQueues是关于任务的 start 的FIFO。如果它们是并发队列,或者您正在提交异步任务,那么当它们完成

时就没有FIFO保证
  

并发队列允许多个任务同时运行。保证任务按照添加顺序开始。任务可以按任何顺序完成,您不知道下一个任务启动所需的时间,也不知道在任何给定时间运行的任务数。     - https://www.raywenderlich.com/148513/grand-central-dispatch-tutorial-swift-3-part-1