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
соответствуют первому сообщению этого потока.