如何并行使用 Swift async/await

Ayx*_*xan 10 ios async-await swift

考虑下面的代码:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这确实并行运行加载例程,但分配结果是同步的:self.bio将始终在 后分配self.img。这意味着简介的 UI 必须等待图像加载。我希望这些能够相互解耦。完成处理程序在这里是理想的选择,但我们使用的是异步 API。我如何才能使任务按完成顺序进行?

wor*_*dog 19

你可以尝试这样的事情:

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


And*_*ard 5

我相信使用元组可以解决这个问题:

(self.img, self.bio) = await (img, bio)