NSNotification не отправляется, когда postNotificationName: вызывается - PullRequest
14 голосов
/ 22 января 2010

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

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

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

и

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

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

Ответы [ 7 ]

12 голосов
/ 22 января 2010

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

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

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

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

11 голосов
/ 11 июля 2013

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

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

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

Тогда вот:

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

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

- (void)updateView:(NSNotification *)notification;
7 голосов
/ 05 декабря 2014

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

- (void)viewDidDisappear:(BOOL)animated{

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];

   [notificationCenter removeObserver:self];

}

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

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

5 голосов
/ 22 января 2010

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

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

на это:

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

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

4 голосов
/ 25 августа 2016

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

dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
});
2 голосов
/ 22 января 2010

Вы пробовали какие-нибудь другие имена, кроме @ "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];
1 голос
/ 03 января 2011

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

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

С postNotificationName и addObserver все в порядке как первое сообщение этой темы.

...