如何并行使用 Swift async/await

Posted

技术标签:

【中文标题】如何并行使用 Swift async/await【英文标题】:How to use Swift async/await in parallel 【发布时间】:2021-10-08 07:04:34 【问题描述】:

考虑下面的代码:

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。我怎样才能让作业按完成的顺序进行?

【问题讨论】:

【参考方案1】:

你可以试试这样的:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于如何并行使用 Swift async/await的主要内容,如果未能解决你的问题,请参考以下文章

Swift 并行编程现状和展望 - async/await 和参与者模式

swift Swift中的并行NSOperation

swift Swift中的并行NSOperation

swift Swift中的并行NSOperation

Swift 和 Android 之间的 UI 并行性

与金属 swift 并行计算数组值的总和