Ответ
MainActor — это глобальный актор (actor), предоставляемый фреймворком Swift Concurrency, который выполняет свою работу исключительно на главной (Main) очереди (потоке). Он используется для безопасного обновления пользовательского интерфейса.
Для чего нужен? Все операции с UI в iOS/macOS должны выполняться на главном потоке. MainActor обеспечивает это автоматически в контексте async/await.
Способы использования:
- Аннотация функции: Гарантирует, что тело функции выполнится на главном акторе.
@MainActor func updateLabel(text: String) { myLabel.text = text // Безопасное обновление UI } - Аннотация класса/свойства: Все методы и изменения свойств класса будут изолированы на главном акторе.
@MainActor final class ViewModel: ObservableObject { @Published var data: [String] = [] // Изменения публикуются на главном потоке } - Вызов с
await: Принудительный переход на главный актор для конкретного блока кода.func fetchData() async { let data = await networkService.loadData() await MainActor.run { // Переключаем контекст на главный поток self.items = data } }
Ключевые особенности:
- Замена
DispatchQueue.main.async: Более безопасная и интегрированная альтернатива в современном асинхронном коде. - Сквозная изоляция: Компилятор проверяет, что код, изолированный
@MainActor, не вызывается случайно с другого потока. - Глобальный доступ: К
MainActorможно обратиться из любого места, используяMainActor.runилиawaitна вызове@MainActorфункции.