async let
— это синтаксическая конструкция в Swift, позволяющая параллельно запускать несколько асинхронных операций и затем ожидать их результаты. Это часть механизма structured concurrency, представленного в Swift 5.5.
func fetchData() async {
async let userData = fetchUser() // Запускаем сразу
async let postsData = fetchPosts() // Запускаем параллельно
// Ожидаем результаты
let user = try? await userData
let posts = try? await postsData
print("User: \(user), Posts: \(posts)")
}
Характеристика | async/await | async let |
---|---|---|
Выполнение | Последовательное | Параллельное |
Запуск операций | Ожидает завершения перед след. | Запускает сразу |
Порядок | Четкий порядок выполнения | Неопределенный порядок завершения |
Использование | Для зависимых операций | Для независимых операций |
func loadGallery() async {
async let firstImage = downloadImage(url: imageURLs[0])
async let secondImage = downloadImage(url: imageURLs[1])
async let thirdImage = downloadImage(url: imageURLs[2])
let images = await [try firstImage, try secondImage, try thirdImage]
galleryView.update(with: images)
}
func fetchMultipleResources() async throws {
async let data1 = fetchResource(id: 1)
async let data2 = fetchResource(id: 2)
do {
let (resource1, resource2) = await (try data1, try data2)
// Обработка данных
} catch {
print("Ошибка загрузки: \(error)")
// Отмена других задач автоматически
}
}
// Выполняется последовательно - общее время ```2000 мс
let user = await fetchUser() // ```1000 мс
let posts = await fetchPosts() // ```1000 мс
// Выполняется параллельно - общее время ```1000 мс
async let user = fetchUser() // ```1000 мс
async let posts = fetchPosts() // ```1000 мс
let (userResult, postsResult) = await (user, posts)
Комбинация с TaskGroup
:
func fetchAllData() async throws {
async let user = fetchUser()
let posts = try await withThrowingTaskGroup(of: [Post].self) { group in
group.addTask { try await fetchPosts() }
group.addTask { try await fetchRecommendedPosts() }
return try await group.reduce(into: []) { $0 += $1 }
}
let finalData = await (user, posts)
}
async let
— это мощный инструмент для:
Основные отличия от обычного async/await:
Используйте async let
для независимых операций, где важен параллелизм, и обычный async/await
для последовательных зависимых операций. В сложных сценариях можно комбинировать оба подхода.