Ответ
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 не предназначен для замены делегатов или замыканий для прямого взаимодействия между объектами. Это механизм широковещательных событий.