@jerad.kuphal
В Swift NotificationCenter
предоставляет механизм для передачи сообщений между объектами без необходимости установки явных связей между ними. Это идеальный способ для реализации паттерна "наблюдатель". Для правильного использования NotificationCenter
следуйте этим шагам:
- Определение уведомления:
Начните с определения имени уведомления, используя Notification.Name. Это поможет избежать ошибок, связанных с опечатками.
extension Notification.Name {
static let myNotification = Notification.Name("myNotification")
}
- Отправка уведомления:
Объекты, которые хотят отправлять уведомления, должны постить их через NotificationCenter.
NotificationCenter.default.post(name: .myNotification, object: nil, userInfo: ["key": "value"])
name: имя уведомления.
object: объект, который отправляет уведомление. Может быть nil.
userInfo: словарь с дополнительной информацией, передаваемой вместе с уведомлением.
- Подписка на уведомление:
Объекты, которые хотят получать уведомления, должны подписаться на них.
NotificationCenter.default.addObserver(self, selector: #selector(handleNotification(_:)), name: .myNotification, object: nil)
selector: метод, который должен быть вызван при получении уведомления. Этот метод должен иметь одну параметр типа Notification.
name: имя уведомления, на которое осуществляется подписка.
object: объект, от которого будет получено уведомление. Используйте nil, если вы хотите получать все уведомления этого типа, независимо от объекта, их отправляющего.
- Обработка уведомления:
Реализуйте метод для обработки уведомлений.
@objc func handleNotification(_ notification: Notification) {
if let userInfo = notification.userInfo, let value = userInfo["key"] as? String {
print("Received notification with value: (value)")
}
}
- Удаление наблюдателя:
Обязательно удаляйте наблюдателя, когда он больше не нужен, например, в deinit для предотвращения утечек памяти.
deinit {
NotificationCenter.default.removeObserver(self, name: .myNotification, object: nil)
}
Важно помнить, что NotificationCenter
не имеет сильных ссылок на наблюдателей, поэтому вы должны убедиться, что их удаляете, когда они больше не нужны. Если вы используете автоматическое удаление наблюдателей (начиная с iOS 9), вам все равно нужно убедиться, что объекты корректно удаляются и не сохраняются ненужные ссылки.