我对 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() 完成运行(可能在不同的线程上)。我的问题:
for 循环 行中await id 的目的是什么?如果我们在没有 await 的情况下编写如下 for 循环会怎样?
for id in staticImageIDsURL.lines {
}
上面的 for 循环 是否始终确保图像以顺序方式添加到 collage 中,而不是根据提前获取的缩略图以随机顺序添加?因为在编写代码的经典完成处理程序方式中,确保数组中的顺序需要对代码进行更多的逻辑处理。
答案 0 :(得分:2)
await id
表示从 id
获取 staticImageIDsURL.lines
元素本身就是一个异步操作。
for await id in staticImageIDsURL.lines
这个操作必须在我们进入该迭代的 for 循环体之前完成。您应该阅读 AsyncSequence
文档以了解有关此的更多信息,或者可以观看 Meet AsyncSequence WWDC 2021 会议。
对于每一次迭代,当你说这句话时,你都在等待当前操作完成。
let thumbnail = await fetchThumbnail(for: id)
每次启动新的 fetch 调用时,这一行都会暂停该函数,因此这些缩略图调用可以保证按顺序完成。这些调用绝不会并行发生,第一个调用必须在启动第二个调用之前完成。