Что такое NotificationCenter в iOS?

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

Ответ

NotificationCenter — это реализация паттерна Наблюдатель (Observer) в iOS/macOS. Это централизованный механизм для рассылки событий (уведомлений) между любыми объектами, которые не знают друг о друге.

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

  • Отправитель (Poster): Публикует уведомление с именем и опциональными данными (userInfo).
  • Центр (NotificationCenter.default): Получает и перенаправляет уведомление.
  • Подписчик (Observer): Регистрирует обработчик для конкретного имени уведомления.

Пример использования:

// 1. Определение имени уведомления (лучше через extension)
extension Notification.Name {
    static let userDidLogin = Notification.Name("UserDidLoginNotification")
}

// 2. Подписка на уведомление (например, в ViewController)
NotificationCenter.default.addObserver(
    self,
    selector: #selector(handleLogin(_:)),
    name: .userDidLogin,
    object: nil
)

// 3. Публикация уведомления
NotificationCenter.default.post(
    name: .userDidLogin,
    object: self,
    userInfo: ["username": "John"]
)

// 4. Обработчик уведомления
@objc func handleLogin(_ notification: Notification) {
    if let username = notification.userInfo?["username"] as? String {
        print("Пользователь (username) вошел в систему")
    }
}

// 5. ОБЯЗАТЕЛЬНО отписаться при деинициализации
// (в блоковом варианте addObserver это происходит автоматически)
deinit {
    NotificationCenter.default.removeObserver(self)
}

Важные замечания:

  • Удаление подписок: Всегда удаляйте наблюдателей (removeObserver), чтобы избежать утечек памяти и крашей.
  • Блоковый синтаксис (рекомендуется): Более безопасная альтернатива селекторам.
    let observer = NotificationCenter.default.addObserver(
    forName: .userDidLogin,
    object: nil,
    queue: .main
    ) { notification in
    // Обработка в замыкании
    }
    // Для отписки: NotificationCenter.default.removeObserver(observer)
  • Не для передачи данных: NotificationCenter не предназначен для замены делегатов или замыканий для прямого взаимодействия между объектами. Это механизм широковещательных событий.