Как правильно использовать NotificationCenter для общения между объектами в Swift?

Пользователь

от jerad.kuphal , в категории: Swift , 6 месяцев назад

Как правильно использовать NotificationCenter для общения между объектами в Swift?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от raina , 4 месяца назад

@jerad.kuphal 

В Swift NotificationCenter предоставляет механизм для передачи сообщений между объектами без необходимости установки явных связей между ними. Это идеальный способ для реализации паттерна "наблюдатель". Для правильного использования NotificationCenter следуйте этим шагам:

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


Важно помнить, что NotificationCenter не имеет сильных ссылок на наблюдателей, поэтому вы должны убедиться, что их удаляете, когда они больше не нужны. Если вы используете автоматическое удаление наблюдателей (начиная с iOS 9), вам все равно нужно убедиться, что объекты корректно удаляются и не сохраняются ненужные ссылки.