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