我对2021年WWDC发布的Swift 5.5中新的异步/等待模式感到困惑,似乎涉及到很多学习,并不像假装的那样容易掌握。我只是在WWDC视频中看到了这个循环:
for await id in staticImageIDsURL.lines {
let thumbnail = await fetchThumbnail(for: id)
collage.add(thumbnail)
}
let result = await collage.draw()
据我所知,循环的每次迭代都会挂起循环,直到fetchThumbnail((完成运行(可能在不同的线程上(。我的问题:
循环行中等待id的目标是什么?如果我们在没有等待的情况下将for循环写成如下呢?
for id in staticImageIDsURL.lines { }
上面循环的是否总是确保图像以顺序的方式而不是随机的顺序添加到拼贴中,这取决于早期提取的缩略图?因为在经典的完成处理程序编写代码的方式中,确保数组中的顺序需要对代码进行更多的逻辑处理。
await id
意味着从staticImageIDsURL.lines
获取id
元素本身就是一个异步操作。
for await id in staticImageIDsURL.lines
这个操作必须在我们进入该迭代的循环体之前完成。您应该阅读AsyncSequence
文档以了解更多关于此的信息,或者可以观看Meet AsyncSequenceWWDC 2021会话。
对于每次迭代,您都在等待当前操作完成。
let thumbnail = await fetchThumbnail(for: id)
每次启动新的提取调用时,这一行都会暂停函数,因此这些缩略图调用保证按顺序完成。这些调用从不并行发生,第一个调用必须在第二个调用启动之前完成。