NSNotification не отправляется, когда postNotificationName:вызванный
-
22-09-2019 - |
Вопрос
Я пытаюсь получить один экземпляр использования 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
все в порядке, как и в первом посте этой темы.