Что такое MainActor в Swift?

«Что такое MainActor в Swift?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

MainActor — это глобальный актор (actor), предоставляемый фреймворком Swift Concurrency, который выполняет свою работу исключительно на главной (Main) очереди (потоке). Он используется для безопасного обновления пользовательского интерфейса.

Для чего нужен? Все операции с UI в iOS/macOS должны выполняться на главном потоке. MainActor обеспечивает это автоматически в контексте async/await.

Способы использования:

  1. Аннотация функции: Гарантирует, что тело функции выполнится на главном акторе.
    @MainActor
    func updateLabel(text: String) {
        myLabel.text = text // Безопасное обновление UI
    }
  2. Аннотация класса/свойства: Все методы и изменения свойств класса будут изолированы на главном акторе.
    @MainActor
    final class ViewModel: ObservableObject {
        @Published var data: [String] = [] // Изменения публикуются на главном потоке
    }
  3. Вызов с await: Принудительный переход на главный актор для конкретного блока кода.
    func fetchData() async {
        let data = await networkService.loadData()
        await MainActor.run { // Переключаем контекст на главный поток
            self.items = data
        }
    }

Ключевые особенности:

  • Замена DispatchQueue.main.async: Более безопасная и интегрированная альтернатива в современном асинхронном коде.
  • Сквозная изоляция: Компилятор проверяет, что код, изолированный @MainActor, не вызывается случайно с другого потока.
  • Глобальный доступ: К MainActor можно обратиться из любого места, используя MainActor.run или await на вызове @MainActor функции.