Приложение на основе документа Cocoa: уведомление не всегда получено наблюдателем

Я надеюсь, что кто-то может помочь с моей проблемой уведомлений. У меня есть уведомление, которое выглядит правильно, но не доставляется должным образом. Я разрабатываю приложение на основе документов. Класс делегата/документа публикует уведомление при чтении из сохраненного файла:

[[NSNotificationCenter defaultCenter] postNotificationName:notifyBsplinePolyOpened object:self];

Ведение журнала говорит мне, что эта строка достигается всякий раз, когда я открываю сохраненный документ.

В классе DrawView у меня есть наблюдатели для уведомления windowOpen и уведомления об открытии файла bsplinePoly:

[[NSNotificationCenter defaultCenter] addObserver:self
                                                          selector:@selector(mainWindowOpen:)
                                                          name:NSWindowDidBecomeMainNotification
                                                          object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                                          selector:@selector(savedBspline:)
                                                          name:notifyBsplinePolyOpened
                                                          object:nil];

- (void)        mainWindowOpen:(NSNotification*) note
{
        NSLog(@"Window opened");
        _mainWindow = [note object];
}

- (void) savedBspline:(NSNotification*) note
{
        NSLog(@"savedBspline called");
        NSLog(@"note is %@", [note name]);
}

Поведение странное. Когда я сохраняю и закрываю главное окно, а затем снова открываю его, я получаю сообщение «Окно открыто», но не сообщение «вызвано savedBspline». Если я оставлю главное окно открытым и открою ранее сохраненный сеанс, я получу сообщение «Окно открыто» и сообщение «вызвано сохраненноеBspline».

Я искал онлайн-обсуждение и документацию Apple DevCenter, но не видел этой проблемы.


person roysolay    schedule 26.04.2010    source источник


Ответы (1)


NSNotification доставка работает должным образом (по крайней мере когда NSNotificationQueue не задействованы). Они доставляются сразу, а не по другим потокам, без задержки и без фильтрации.

Я бы сказал, что некоторые из ваших объектов еще не созданы, когда срабатывает уведомление, или вы каким-то другим образом перепутали порядок выполнения: вы говорите, что отправляете уведомление при чтении из сохраненного файла, но тогда вам не хватает уведомление при сохранении и закрытии окна.

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

person Nikolai Ruhe    schedule 26.04.2010
comment
Спасибо Николай. Я часами смотрел на свой код без успеха, и ваши комментарии привели меня прямо к проблеме. Наблюдатель вызывается в методе initWithFrame класса DrawView. Используя логирование, я выяснил, что недостающее уведомление отправляется до вызова этого метода при открытии нового окна. Я изменю код на addObserver, где он будет получать уведомления. - person roysolay; 27.04.2010