for 循环中的 Swift async/await

Dee*_*rma 9 async-await swift swift5

我对 WWDC 2021 上宣布的 Swift 5.5 中新的异步/等待模式感到摸不着头脑,似乎涉及到很多学习内容,但并不像想象的那么容易掌握。我刚刚在 WWDC 视频中看到了这个 for 循环:

    for await id in staticImageIDsURL.lines {

        let thumbnail = await fetchThumbnail(for: id)
        collage.add(thumbnail)
    }

    let result = await collage.draw()
Run Code Online (Sandbox Code Playgroud)

据我了解,for 循环的每次迭代都会挂起for 循环,直到 fetchThumbnail() 完成运行(可能在不同的线程上)。我的问题:

  1. for循环行中await id的目的是什么?如果我们将 for 循环写成如下而不带 wait 会怎么样?

      for id in staticImageIDsURL.lines {
    
      }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 上面的for 循环是否始终确保图像以顺序方式添加到拼贴画中,而不是根据提前获取的缩​​略图以随机顺序添加到拼贴画中?因为在编写代码的经典完成处理程序方式中,确保数组中的顺序需要对代码进行更多逻辑。

Tar*_*agi 9

await id获取元素的方法本身就是一个异步操作。idstaticImageIDsURL.lines

for await id in staticImageIDsURL.lines
Run Code Online (Sandbox Code Playgroud)

该操作必须在我们进入该迭代的 for 循环体之前完成。您应该阅读AsyncSequence文档以了解更多信息,或者可以观看Meet AsyncSequence WWDC 2021会议。


对于每次迭代,当您这样说时,您正在等待当前操作完成。

let thumbnail = await fetchThumbnail(for: id)
Run Code Online (Sandbox Code Playgroud)

每次启动新的提取调用时,此行都会挂起该函数,因此保证这些缩略图调用按顺序完成。这些调用永远不会并行发生,第一个调用必须在第二个调用启动之前完成。