Swift async/await 在 for 循环中

Swift async/await in for loop

我对 WWDC 2021 中宣布的 Swift 5.5 中的新 async/await 模式摸不着头脑,似乎涉及很多学习内容,并不像假装的那样容易掌握。例如,我刚刚在 WWDC 视频中看到了这个 for 循环:

    for await id in staticImageIDsURL.lines {

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

    let result = await collage.draw()

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

  1. for loop行中await id的objective是什么?如果我们把for循环写成下面这样没有await呢?

      for id in staticImageIDsURL.lines {
    
      }
    
  2. 上面的 for 循环 是否始终确保图像按顺序而不是随机添加到 collage顺序取决于哪些缩略图被提前获取?因为在经典的完成处理程序编写代码的方式中,确保数组中的顺序需要更多的代码逻辑。

await id表示从staticImageIDsURL.lines获取id元素本身就是一个异步操作。

for await id in staticImageIDsURL.lines

此操作必须在我们进入该迭代的 for 循环体之前完成。你应该阅读 AsyncSequence docs to know more on this OR can watch Meet AsyncSequence WWDC 2021 session.


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

let thumbnail = await fetchThumbnail(for: id)

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