Карточка Middle Swift Concurrency обновлено

withTaskGroup: параллельная загрузка списка

Вопрос

Как параллельно загрузить картинки для массива URL и собрать словарь результатов?

Попробуйте сами

Ответьте про себя или вслух, потом откройте ответ и сверьтесь.

Показать ответ и разбор

Коротко

await withTaskGroup(of: (URL, Image?).self) { group in for url in urls { group.addTask { (url, await load(url)) } }; for await (url, img) in group { result[url] = img } }

Ответ

await withTaskGroup(of: (URL, Image?).self) { group in for url in urls { group.addTask { (url, await load(url)) } }; for await (url, img) in group { result[url] = img } }

Разбор

Группа ждёт всех детей, отмена группы отменяет детей. Для ограничения параллельности добавляют новые задачи по мере завершения старых.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.