В каком потоке выполняется код внутри модификатора .task в SwiftUI?

«В каком потоке выполняется код внутри модификатора .task в SwiftUI?» — вопрос из категории SwiftUI, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

По умолчанию код выполняется на 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
}