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() 完成 运行(可能在不同的线程上)。我的问题:
for loop行中await id的objective是什么?如果我们把for循环写成下面这样没有await呢?
for id in staticImageIDsURL.lines {
}
上面的 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 调用时挂起该函数,因此这些缩略图调用可以保证按顺序完成。这些调用永远不会并行发生,第一个必须在第二个启动之前完成。
我对 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 loop行中await id的objective是什么?如果我们把for循环写成下面这样没有await呢?
for id in staticImageIDsURL.lines { }
上面的 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 调用时挂起该函数,因此这些缩略图调用可以保证按顺序完成。这些调用永远不会并行发生,第一个必须在第二个启动之前完成。