2017-01-01 2 views
-1

Как я могу гарантировать, что наблюдатель в пределах 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

До сих пор я нахожу эти ресурсы

ответ

0

Наблюдатели, которые подписались на NotificationCenter не может выжить приложение перезапускается. Это связано с тем, что объекты, которые вы добавили, удаляются из памяти, как только приложение умирает, будь то сбой или нормальное завершение. При этом все наблюдатели должны быть добавлены во время выполнения вашего приложения, и их также можно удалить во время выполнения вашего приложения. Как только приложение завершается, вся связанная память освобождается, включая подписчиков.

+0

Это противоречит тому, что Apple утверждает: «Блок копируется центром уведомлений и (копией), удерживаемым до тех пор, пока регистрация наблюдателя не будет удалена». И кроме того: тогда я не увижу все больше и больше отпечатков, верно? –

+0

NotificationCenter - это чисто «в памяти». Он не хранит наблюдателей или обратные вызовы на диске, чтобы они могли пережить перезагрузку приложений. Это особенно важно при использовании блоков. Блоки (или замыкания) фиксируют область, в которой они созданы. Если NC сохранит эти блоки во всех перезапусках приложений, все равно придется захватывать весь сеанс приложения. Ответ @LarsBlumbergs правильный. Есть еще одна причина, по которой вы видите все больше и больше уведомлений. – Cabus

+0

Извините, но это не ответ. Прежде всего, это не имеет ничего общего с упорством. Тем временем я нашел другого парня, который боролся с той же проблемой: http://sealedabstract.com/code/nsnotificationcenter-with-blocks-considered-harmful/ f –