Функция выбора не вводится при добавлении наблюдателя

#swift #xcode #nsnotificationcenter #addobserver

#swift #xcode #nsnotificationcenter #addobserver

Вопрос:

В моем первом контроллере просмотра я отправляю уведомление со следующим кодом:

 NotificationCenter.default.post(name: Notification.Name("date"), object: formattedDate)
  

Затем я «получаю» уведомление во втором контроллере представления со следующим кодом:

 func receiveNotification () {
    NotificationCenter.default.addObserver(self, selector: #selector(self.didGetTheDate(_:)), name: NSNotification.Name("date"), object: nil)
}

@objc 
func didGetTheDate(_ notification: Notification) {
    print("In did get date")
    date = notification.object as! String    
}
  

Однако функция «didGetTheDate» никогда не вызывается.
Я трижды проверил, что вызывается функция «receiveNotification», поскольку я добавил операторы печати, чтобы проверить это.

Может кто-нибудь, пожалуйста, помочь мне с этим.

Комментарии:

1. Вы добавили наблюдателя перед отправкой уведомления? Я имею в виду, что receiveNotification() следует вызывать перед отправкой уведомления из ViewController 1. Кроме того, вы не можете освободить ViewController 2, потому что наблюдатель будет освобожден

2. Я добавил наблюдателя после публикации уведомления. Как мне получить уведомление, если уведомление еще не было опубликовано?. Что вы подразумеваете под «Кроме того, вы не можете освободить ViewController 2, потому что наблюдатель будет освобожден». Извините, я новичок в этом

3. Если вы хотите передавать события из одного VC в другой, вам понадобится очередь, в этом случае вы можете просто создать синглтон со списком, который вы можете вызвать, чтобы узнать, есть ли новое событие «Дата». Для освобождения VC 2 вам следует взглянуть на то, как работает память на iOS и ARC

4. О, я только что понял, большое вам спасибо, я застрял на этом часами. Таким образом, сначала необходимо добавить наблюдателя, поскольку он «ищет» сообщение с тем же NSNotification.Name .

5. Точно, NSNotificacionCenter — это вариант шаблона Observer, вы можете прочитать об этом здесь: tutorialspoint.com/design_pattern/observer_pattern.htm (Я добавлю это в качестве ответа для будущих пользователей)

Ответ №1:

NSNotificacionCenter это вариант шаблона Observer, вы можете прочитать об этом здесь

Это означает, что вам нужно будет зарегистрировать наблюдателя перед отправкой любого уведомления. Если вы опубликуете что-либо до этого, NSNotificationCenter он посмотрит на наблюдателя name и увидит, что его никто не слушает, поэтому ничего не произойдет.