2012-02-26 2 views
0

как я сказал здесь, я использую NSNotificationCenter.NSNotificationCenter не работает?

на класса А (наблюдателя) по методу инициализации я получил:

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

на ClassB я получил:

//FILL NSDICTIONARY WITH DATA 
    [dict setObject:@"SPOT1" forKey:[array objectAtIndex:0]]; 
    [dict setObject:@"SPOT2" forKey:[array objectAtIndex:1]]; 
    [dict setObject:@"SPOT3" forKey:[array objectAtIndex:2]]; 
    [dict setObject:@"SPOT4" forKey:[array objectAtIndex:3]]; 
    [dict setObject:@"SPOT5" forKey:[array objectAtIndex:4]]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"HotSpotTouched" object:dict]; 

функция в классе А getSensorsData не называемый.

Что здесь не так?

спасибо!

+0

Как выглядит ваша декларация для 'getSensorsData'? это в вашем файле интерфейса .h'? –

+0

@MichaelDautermann: - (void) getSensorsData: (NSNotification *) SPOTS – Curnelious

+1

Это заявление выглядит потенциально неправильным. Измените свой вопрос, чтобы показать свою декларацию и как вы обращаетесь к вашему 'NSDictionary' в' getSensorsData'. Вы устанавливаете точку останова, и это не срабатывает при срабатывании уведомления? Является ли классB происходящим в другом потоке? –

ответ

-1

проблема решена:

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

мой NSDictionary аргумент был нулевым (потому что причина, о которой я до сих пор не знаю), поэтому звонок не запускается.

3

Вы отправляете dict в качестве notificationSender при отправке уведомления и nil при добавлении наблюдателя. Таким образом, ваше уведомление будет отфильтровано, поскольку отправители не совпадают.

Update:
Как отметил joerick в комментариях, передавая ноль при добавлении наблюдателя будет отключить фильтрацию отправителей. Так что это не проблема.

Я только что создал небольшой образец проекта и для меня отправлены уведомления.

@ Rant: Если вы хотите передать произвольные данные вместе с вашим уведомлением, вы должны использовать словарь пользовательской информации (как указано в комментарии Кирилла).

+0

Да, это то, о чем я тоже думал. –

+2

Вы хотите опубликовать 'dict' как' userData', а не 'object' вашего' NSNotification'. – Cyrille

+1

Передача 'nil' для' addObserver: ... 'означает, что все уведомления наблюдаются независимо от отправителя. https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html – joerick

3

Звонки в центр уведомлений выглядят правильно. Я подозреваю, что проблема связана с циклом liffe объекта A. Вы говорите, что регистрируетесь для уведомления в методе init. Правильно ли назначено self:

-(id)init 
{ 
    //self does not have a meaningful value prior to the call to [super init] 
    self = [super init]; 
    if (self != nil) 
    { 
     //ensure addObserver is called in the if code block 
    } 
    return self; 
} 

Кроме того, это хорошая практика, чтобы использовать константы для имен в уведомлении, как они смягчают против опечаток. См. Constants in Objective C.

+0

спасибо за ваш ответ, я: - (id) init {if ((self = [super init])) .... это нормально? – Curnelious

+0

Я также пробовал точно так же, как вы сказали, и печатает nslog под оператором if. – Curnelious

Смежные вопросы