Рассмотрим код ниже:

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. Это означает, что пользовательскому интерфейсу для биографии придется дождаться загрузки изображения. Я бы хотел, чтобы они были отделены друг от друга. Здесь идеально подошли бы обработчики завершения, но мы используем асинхронный API. Как сделать так, чтобы задание выполнялось в порядке выполнения?

0
Ayxan Haqverdili 8 Окт 2021 в 10:04

2 ответа

Лучший ответ

Вы можете попробовать что-то вроде этого:

func loadData() async {
    await withTaskGroup(of: Void.self) { group in
        group.addTask { self.img = await loadImage() }
        group.addTask { self.bio = await loadBio() }
    }
}
1
workingdog 8 Окт 2021 в 09:18

Я считаю, что использование кортежей решит эту проблему:

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

0
Andy Heard 8 Окт 2021 в 08:52