NSNotification не отправляется, когда postNotificationName: вызвано

Я пытаюсь получить один экземпляр использования NSNotificationCenter с addObserver и postNotificationName, но я не могу понять, почему он не будет работать.

У меня есть 2 строки для кода, чтобы добавить наблюдателя и отправить сообщение в 2 разных классах

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(newEventLoaded:) name:@"Event" object:nil];

и

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];

Если я устанавливаю имя в nil, он отлично работает, потому что это просто трансляция, когда я пытаюсь определить имя уведомления, сообщения никогда не пройдут.

Ответ 1

Весь мой код использует NSNotifications так:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ScanCompleted" object:nil];

[[NSNotificationCenter defaultCenter] postNotificationName:@"ScanCompleted" object:nil];

Первый регистрирует уведомление и вторую отправку уведомления.

Ответ 2

В основном все зависит от порядка выполнения. Если вы выполнили postNotificationName перед addObserver, то это непростая задача. Используйте точки останова и выполните код:)

Ваша первая точка останова должна остановиться здесь:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView:) name:@"ScanCompleted" object:nil];

Затем здесь:

[[NSNotificationCenter defaultCenter]postNotificationName:@"ScanCompleted" object:self];

Кроме того, убедитесь, что селектор имеет двоеточие. Потому что его подпись метода будет:

- (void)updateView:(NSNotification *)notification;

Ответ 3

У меня такая же проблема. Причина в том, что я вызвал метод removeObserver в

- (void)viewDidDisappear:(BOOL)animated{

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];

   [notificationCenter removeObserver:self];

}

Поэтому проверьте, не вызывал ли вы removeObserver перед postNotification.

Советы: Вы можете выполнить поиск по ключевому слову "removeObserver", чтобы узнать, вызывали ли вы эту функцию.

Ответ 4

Измените это:

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];

:

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:nil];

Если ваше первое уведомление зарегистрировано должным образом, необходимо вызвать newEventLoaded.

Ответ 5

У меня была аналогичная проблема, и моя проблема вызвана тем, что уведомление вызывается в другом потоке. Это решило мою проблему.

dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
});

Ответ 6

Вы пробовали другие имена, но @ "Событие" и ноль? Чтобы быть уверенным, вы могли бы определить имена событий в одном файле и включить их в регистрацию и отправку уведомлений. Например:

Заголовочный файл:

extern NSString * const NOTE_myEventName;

Исходный файл:

NSString * const NOTE_myEventName = @"MyEventName";

Регистрация:

[[NSNotificationCenter defaultCenter]
 addObserver:self
    selector:@selector(handleMyEvent:)
        name:NOTE_myEventName
      object:nil];

Отправка уведомления:

[[NSNotificationCenter defaultCenter]
    postNotificationName:NOTE_myEventName object:nil];

Ответ 7

Я успешно зафиксировал свой "NSNotification, который не отправляется, когда postNotificationName: называется" сбой ".

Я обнаружил, что реальная ошибка в обработчике сообщений уведомлений.

postNotificationName и addObserver соответствуют первому сообщению этого потока.