2010-01-21 2 views
14

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

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

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

и

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

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

ответ

12

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

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

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

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

+3

Это именно то, что у меня есть, но он отказывается работать, заставляет меня думать, что проблема в другом месте, но центр уведомлений кажется вполне самодостаточным по коду. Я не знаю, где еще искать то, что может вызвать проблему. Возможно, Threading? Является ли iPhone автоматически многопоточным? Не то, что я знаю из. – Affian

+0

Правильно ли работает инструкция NSLog в селекторе (в моем случае updateView)? Если ваш метод не принимает никаких параметров, попробуйте имя метода без: so '[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (newEventLoaded) name: @« Событие »: nil];' –

+0

Все мое тестирование был выполнен с помощью NSLog в выбранном методе, и он работает, когда я устанавливаю имя уведомителя на нуль. Я также пробовал это как с параметрами, так и без них в методе – Affian

5

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

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

к этому:

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

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

+1

Не повезло, я пробовал различные комбинации значений объектов и значений событий, но единственный, с которым я могу работать, кажется, имеет имя, заданное как ноль, если я не пропущу что-то в документация. – Affian

+1

+1. Благодаря! Это сработало – Dexter

+0

+1 Это помогло мне, спасибо –

1

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

Заголовок файла:

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

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

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

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

+1

В чем проблема с обработчиком сообщений? И как вы его исправили? – Meet

11

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

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

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

Тогда здесь:

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

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

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

Спасибо, что напомнили, что 'postNotificationName' вызывается перед' addObserver'. Это решило мою проблему. –

5

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

- (void)viewDidDisappear:(BOOL)animated{ 

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

    [notificationCenter removeObserver:self]; 

} 

Так проверить, была ли, если вы назвали removeObserver перед тем postNotification.

+1

Пожалуйста, используйте ссылку [edit] (http://stackoverflow.com/posts/27315932/edit) под своим ответом, чтобы исправить форматирование кода. – nop77svk

+0

То же самое происходило со мной. Пропустил какой-то код, который фактически удалял всех наблюдателей после того, как я добавил наблюдателя. Не удивительно, что он не работал. – AndyDunn

3

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

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

Спасибо! Он работает на меня. – Raja