swift - 快速异步/等待 for 循环
问题描述
我对 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的目标是什么?如果我们在没有等待的情况下将 for 循环写成下面的样子怎么办?
for id in staticImageIDsURL.lines { }
上面的for 循环是否始终确保图像按顺序添加到拼贴画中,而不是根据早期获取的缩略图以随机顺序添加?因为在编写代码的经典完成处理程序方式中,确保数组中的顺序需要更多的代码逻辑。
解决方案
从 中获取元素的方法await id
本身就是一个异步操作。id
staticImageIDsURL.lines
for await id in staticImageIDsURL.lines
此操作必须在我们进入该迭代的 for 循环主体之前完成。您应该阅读AsyncSequence
文档以了解有关此内容的更多信息,或者可以观看Meet AsyncSequence WWDC 2021会议。
对于每次迭代,当您说这句话时,您正在等待当前操作完成。
let thumbnail = await fetchThumbnail(for: id)
此行将在每次启动新的 fetch 调用时暂停该功能,因此这些缩略图调用保证按顺序完成。这些调用永远不会并行发生,首先必须在启动第二个调用之前完成。
推荐阅读
- c - 从 file.cfg 读取时出现 Segmentation_Fault 错误
- python - The colon and dot in a print statement
- javascript - 未处理的拒绝(错误):响应不成功:收到状态代码 400 new ApolloError
- java - 从仅包含 15 行的 WebTable 中删除行
- postgresql - AWS RDS PostgreSQL - 创建后不久自动删除索引
- python - 如何从嵌套字典中堆叠键并将其展平
- android - android studio禁用Gradle“离线模式”并同步项目
- activemq-artemis - Artemis jolokia rest api 没有返回真实数据 (Jsr160ProxyNotEnabledByDefaultAnymoreDispatcher)
- visual-studio - 在 Visual Studio 的“关于”对话框中显示正确的扩展版本号
- flutter - flutter中如何使用函数的return填充一个DropDownMenu?