ios - 如何并行使用 Swift async/await
问题描述
考虑下面的代码:
class UserProfile
{
private var img: UIImage? {
didSet { /* update ui */ }
}
private var bio: String? {
didSet { /* update ui */ }
}
private func loadImage() async -> UIImage? {
// ...
}
private func loadBio() async -> String? {
// ...
}
public func loadData() async {
async let img = loadImage()
async let bio = loadBio()
self.img = await img
self.bio = await bio
}
}
虽然这确实并行运行加载例程,但分配结果是同步的:self.bio
将始终在self.img
. 这意味着 bio 的 UI 将不得不等待图像被加载。我希望这些彼此分离。完成处理程序在这里是理想的,但我们使用的是异步 API。我怎样才能让作业按完成的顺序发生?
解决方案
你可以尝试这样的事情:
func loadData() async {
await withTaskGroup(of: Void.self) { group in
group.addTask { self.img = await loadImage() }
group.addTask { self.bio = await loadBio() }
}
}
推荐阅读
- html - 如何将不同的图片添加到共享同一类的一行 div 中?
- android - Dagger/MissingBinding androidx.lifecycle.ViewModelProvider.Factory 不能在没有@Provides-annotated 方法的情况下提供
- javascript - 在没有 I/O 的情况下,javascript(在浏览器中)中的异步/承诺是否有益?
- python - 使用 PyInstaller 编译 python,用 Python
- ionic3 - Ionic4 与 Ionic3 中的离子段
- .net - 如何在空 ADT 帐户中创建 Azure 数字孪生备份并将其还原?
- vhdl - 在包内使用但未声明的组件
- java - 如何在recyclerview 中为togglebutton.setOnCheckedChangedListener 创建一个接口?
- python - 如何返回满足条件的字典中的最后一个值
- ldap - WSO2am 与 ldap AD 集成时抛出“尝试连接到端点时出错。无法为 ssl://localhost:7712 借用客户端”