Сегодня разберем
@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, предотвращая случайные краши при обновлении интерфейса из фоновых задач.