Ответ
По умолчанию код выполняется на MainActor (главном потоке).
Модификатор .task создает асинхронную задачу, привязанную к жизненному циклу вью. Swift Conruntime автоматически запускает её в контексте MainActor, чтобы обеспечить безопасность работы с UI.
Пример и важные детали:
.task {
// Этот код запускается и выполняется на главном потоке.
isLoading = true
// Приостановка на `await`. Поток освобождается для других задач.
let data = await networkService.fetchData()
// Продолжение также выполняется на главном потоке.
self.items = data
isLoading = false
}
Как выполнить тяжелую работу в фоне?
Используйте Task.detached или явно выносите вычисления из контекста MainActor:
.task {
let heavyResult = await Task.detached(priority: .userInitiated) {
// Этот блок выполняется в фоновом потоке из пула.
return await performHeavyCalculation()
}.value
// Возвращаемся в главный поток для обновления состояния.
self.result = heavyResult
}