Добавить объявление

@MainActor в Swift: как избежать багов с UI

Сегодня разберем @MainActor - один из самых важных атрибутов для iOS-разработки, который спасает от случайных крашей при обновлении интерфейса.

Что такое @MainActor:


  • Маркер, гарантирующий выполнение кода в главном потоке.

  • Обязательное требование для всех операций с UI в SwiftUI/UIKit.

  • Часть системы акторов (Swift Concurrency).

Как он работает:


Автоматическая диспетчеризация.
Помеченный код всегда выполняется на главном потоке:

@MainActor
func updateUI() {
label.text = "Обновлено!" // Безопасное обновление UI
}


Для классов:

Можно пометить весь класс, если он работает с интерфейсом:

@MainActor
class UserProfileViewModel: ObservableObject {
@Published var name: String = "" // Изменения в главном потоке
}

Ошибки без @MainActor:


Task {
let data = await loadData() // Фоновое выполнение
titleLabel.text = data.title // Краш: попытка обновить UI не из главного потока
}

Решение:


Task {
let data = await loadData()

await MainActor.run { // Переключение на главный поток
titleLabel.text = data.title
}
}

Особенности в SwiftUI:


body уже на главном потоке.
Нет нужды дополнительно маркировать:

struct ContentView: View {
var body: some View { // Автоматически @MainActor
...
}
}

MVVM и ObservableObject.
Лучше явно пометить ViewModel при помощи @MainActor:

@MainActor
class SettingsViewModel: ObservableObject {
@Published var theme: Theme = .light
}

Вывод:


@MainActor - это важный инструмент для безопасной работы с UI, который автоматически гарантирует выполнение кода в главном потоке. Он особенно полезен в SwiftUI и UIKit, предотвращая случайные краши при обновлении интерфейса из фоновых задач.
15.08.2025 44 426