Приложение, основанное на какаоском документе: уведомление не всегда получено наблюдателем
-
01-10-2019 - |
Вопрос
Я надеюсь, что кто-то может помочь с моей проблемой уведомления. У меня есть уведомление, которое может быть настроено правильно, но он не доставляется, как и ожидалось. Я разрабатываю приложение на основе документов. Учебный класс делегата / документа Сообщает уведомление, когда он читает из сохраненного файла:
[[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]);
}
Поведение нечетное. Когда я сохраняю и закрою главное окно и открываю его, я получаю сообщение «Открытое окно», но не сообщение «SavedBline называется». Если я оставляю главное окно открыть и откройте ранее сохраненный сеанс, я получаю сообщение «Открытое окно» и сообщение «SavedBline под названием».
Я искал онлайн-обсуждение и документацию Apple Devcenter, но я не видел эту проблему.
Решение
NSNotification
Доставка работает, как и ожидалось (по крайней мере, когда нет NSNotificationQueue
участвуют). Они доставляются немедленно, а не на других потоках, без задержки, а не отфильтрованы.
Я бы сказал, что некоторые из ваших объектов еще не создали, когда уведомления о пожарах или выселяете порядок выполнения каким-либо другим способом: вы говорите, что вы публикуете уведомление при чтении из сохраненного файла, но тогда вы отсутствуете Уведомление при сохранении и закрытии окна.
Чтобы помочь отладки, я предлагаю вам настроить наблюдатель уведомления в вашем делегате приложения, который просто регистрирует все уведомления. Тогда вы уверены, что все уведомления доставляются, как ожидалось.