首页 > 解决方案 > 如何并行使用 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。我怎样才能让作业按完成的顺序发生?

标签: iosswiftasync-await

解决方案


你可以尝试这样的事情:

func loadData() async {
    await withTaskGroup(of: Void.self) { group in
        group.addTask { self.img = await loadImage() }
        group.addTask { self.bio = await loadBio() }
    }
}

推荐阅读