Как передать сообщение через Notification Center в закрытый ViewController

nsnotification

#1

подскажите, пожалуйста, как решить такую задачу. При передаче сообщения через Notification Center необходимо, чтобы ViewController, который содержит наблюдателя, был уже загружен в оперативную память. Например, есть приложение, где есть Tab Bar Controller и 3 вкладки - 1, 2, и третья Settings. В Settings есть настройка, например, использовать целые числа или дробные. Чтобы активировать эту настройку я использую Notification Center, т.е. в Settings делается post, а в 1 и 2 VC создаются наблюдатели с соответствующими функциями. Но при этом, в 1-м VC все срабатывает, потому что он открывается при открытии приложения, а во втором VC, если сразу после открытия приложения перейти в Settings, сообщение не срабатывает, потому как этот 2-й VC еще не открывался, не загружен в оперативную память, и соответственно наблюдатель не активирован. Т.е. получается, что сообщение в Notification Center не хранится, оно срабатывает только в момент его запуска.

Вопросы такие:

  1. Есть ли все-таки возможность решить эту задачу в рамках паттерна Notification Center? Т.е. каким-то образом отправить сообщение, которое будет реализовано в VC, который еще не был открыт, не загружен еще в оперативную память, в момент отправки сообщения.

  2. Если нет, то каким образом оптимально решать такую задачу, какие здесь могут использоваться объекты, архитектурные решения?


#2

Так самых простых вариантов масса:

  • любая глобальная переменная, которую читаете при загрузке контроллера (это самое очевидно решение :slight_smile: ;
  • юзердефолтс
  • любая система хранения локальных данных: coredata, realm, plist…

#3

Создавайте наблюдатели в init методах вью контроллеров, контроллеры инициализируются при добавлении в TabBarController.

Для storyboard:

required init?(coder: NSCoder) {
    super.init(coder: coder)
    NotificationCenter.default.addObserver...
}

Если контроллер инициализирован кодом:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    NotificationCenter.default.addObserver...
}

#4

Спасибо за подсказку, хорошие варианты.

В общем, я так понял, что просто notification здесь недостаточно. В лучшем случае надо сохранять его результат в какой-то переменной и тогда уже при загрузке вьюконтролера он может подхватить.


#5

спасибо, попробую. 20 символов