【问题标题】:How to use Swift async/await in parallel如何并行使用 Swift async/await
【发布时间】: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。我怎样才能让作业按完成的顺序进行?

【问题讨论】:

    标签: ios swift async-await


    【解决方案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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-02
        • 2017-06-28
        • 2017-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多