В Swift современный подход к многопоточности: Structured Concurrency — позволяет легко управлять асинхронными операциями, сохраняя читаемость кода. Рассмотрим два ключевых сценария: последовательное и параллельное выполнение.
1️⃣ Последовательное выполнение.
Когда задачи зависят друг от друга или должны выполняться по очереди:
func fetchData() async {
// Сначала загружаем аккаунты, затем задачи
let accounts = await fetchAccounts()
let tasks = await fetchTasks(accounts: accounts)
print("Аккаунты: \(accounts)")
print("Задачи: \(tasks)")
}
⚠️ Особенности:
🔸 Выполняется пошагово: fetchAccounts() → fetchTasks()
🔸 Подходит, если второй запрос требует данных из первого.
🔸 Простота отладки (очевидный порядок выполнения).
2️⃣ Параллельное выполнение.
Когда задачи независимы и можно сэкономить время, выполняя их одновременно:
func fetchData() async {
// Параллельный запуск
async let accountsRequest = await fetchAccounts()
async let tasksRequest = await fetchTasks()
// Ожидаем результаты
let (accounts, tasks) = await (accountsRequest, tasksRequest)
print("Аккаунты: \(accounts)")
print("Задачи: \(tasks)")
}
⚠️ Особенности:
🔸 Обе функции запускаются одновременно.
🔸 Общее время выполнения ≈ времени самой долгой задачи.
🔸 async let создает параллельное подзадачи.
🔸 Результаты доступны только после await.
✅ Ключевые принципы Structured Concurrency:
Иерархия задач:
🔹 Родительская задача ждет завершения дочерних (async let).
🔹 Отмена родительской отменяет и дочерние.
Безопасность:
🔹 Компилятор контролирует await, предотвращая deadlock.
🔹 Ошибки распространяются корректно.
Эффективность:
🔹 Система сама решает, сколько потоков использовать.
🔹 Нет ручного управления (DispatchQueue не нужен).
💡 Вывод:
🔸 await — для последовательного кода.
🔸 async let — для параллельных операций.
🔸 Structured Concurrency делает асинхронный код предсказуемым
Используйте эти подходы, чтобы оптимизировать работу с сетью, базами данных или тяжелыми вычислениями.
➡️ Подписаться на канал
Мобильный трудоголик