Как я могу гарантировать, что наблюдатель в пределах NotificationCenter вызывается только один раз - особенно когда приложение вылетает/должно быть остановлено Xcode?Уведомления от NotificationCenter при отладке
Предположим, я хочу напечатать уведомление NSNotification.WhatHaveYou
.
init() {
NotificationCenter.default.addObserver(forName: NSNotification.Name.WhatHaveYou, object: nil, queue: OperationQueue.main, using: { (notification) in
print(notification)
})
}
Что хорошо работает.
Apple, заявил в its documentation for NotificationCenter.default.addObserver(forName:, object:, queue:, using:)
:
Блок будет выполняться при получении уведомления.
Блок копируется центром уведомлений и (копией), хранящимся , до тех пор, пока регистрация наблюдателя не будет удалена.
Но как я могу удалить регистрацию этого наблюдателя, чтобы при следующем запуске приложения не было зарегистрировано никаких дополнительных уведомлений?
Особенно, когда сбои приложения или я остановить приложение через Xcode, наблюдатель не удаляется, поэтому уведомление будет отображаться несколько раз - чтобы быть более точным: lastNumberOfOccurences = lastNumberOfOccurences +1
Как справиться с этим правильно?
Update
До сих пор я нахожу эти ресурсы
- http://benscheirman.com/2012/01/careful-with-block-based-notification-handlers/
- http://sealedabstract.com/code/nsnotificationcenter-with-blocks-considered-harmful/
Это противоречит тому, что Apple утверждает: «Блок копируется центром уведомлений и (копией), удерживаемым до тех пор, пока регистрация наблюдателя не будет удалена». И кроме того: тогда я не увижу все больше и больше отпечатков, верно? –
NotificationCenter - это чисто «в памяти». Он не хранит наблюдателей или обратные вызовы на диске, чтобы они могли пережить перезагрузку приложений. Это особенно важно при использовании блоков. Блоки (или замыкания) фиксируют область, в которой они созданы. Если NC сохранит эти блоки во всех перезапусках приложений, все равно придется захватывать весь сеанс приложения. Ответ @LarsBlumbergs правильный. Есть еще одна причина, по которой вы видите все больше и больше уведомлений. – Cabus
Извините, но это не ответ. Прежде всего, это не имеет ничего общего с упорством. Тем временем я нашел другого парня, который боролся с той же проблемой: http://sealedabstract.com/code/nsnotificationcenter-with-blocks-considered-harmful/ f –