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

StackOverflow https://stackoverflow.com/questions/2113452

Вопрос

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

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

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

и

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

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

Это было полезно?

Решение

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

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

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

Первый — это регистрация уведомления и второй — размещение уведомления.

Другие советы

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

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

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

Тогда здесь:

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

Также убедитесь, что в селекторе включено двоеточие.Потому что подпись метода будет:

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

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

- (void)viewDidDisappear:(BOOL)animated{

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];

   [notificationCenter removeObserver:self];

}

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

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

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

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

к этому:

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

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

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

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

Пробовали ли вы какие-либо другие имена, кроме @"Event" и nil?На всякий случай вы можете определить имена событий в одном файле и включить их как в регистрацию, так и в отправку уведомлений.Например:

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

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];

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

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

Тот самый postNotificationName и addObserver все в порядке, как и в первом посте этой темы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top