Правильное место для вызова .removeObserver для NSNotificationCenter = Swift deinit()?

Я прочитал много предложений о правильном месте для вызова .removeObserver для NSNotificationCenter, поскольку viewDidUnload не вариант.

Мне просто интересно, будет ли новый deinit() в Swift хорошим выбором?

-Ник


person nick    schedule 31.07.2014    source источник
comment
viewDidUnload никогда не был вариантом. Когда вы добавляете наблюдателя?   -  person jrturton    schedule 01.08.2014
comment
Не уверен и в этом. Моя интуиция говорит, что viewDidLoad, но некоторые, кажется, думают, что нужно объединить viewWillAppear для добавления и viewWillDisappear для удаления. Другие заявили, что Dealloc было бы хорошим местом для удаления. Я просто подумал, что удаление в deinit() по мере уничтожения класса может быть хорошим выбором.   -  person nick    schedule 01.08.2014


Ответы (2)


Это действительно зависит от роли класса, в котором вы подписываетесь на уведомления NSNotificationCenter. Если вы подписываетесь на:

UIView

Затем вы должны отказаться от подписки, как только просмотр станет невидимым для пользователя. Чтобы сэкономить циклы ЦП и не потреблять ресурсы, пока пользователь не видит представление.

UIViewController

Здесь также зависит от того, какое действие вы собираетесь выполнить в ответ на уведомление. Если это просто настройка пользовательского интерфейса, вы должны отказаться от подписки, как только контроллер представления исчезнет с экрана.

Уровень вашей службы приложений

Здесь нормально иметь .removeObserver внутри deinit(). однако даже здесь я предлагаю вам более четко указывать, когда вы подписываетесь и отписываетесь от NSNotificationCenternotifications, и помещаете их в методы запуска и остановки вашего сервиса.

person Keenle    schedule 31.07.2014
comment
Спасибо, Кини. Это помогает. Я просто наблюдаю за текстовым полем в контроллере представления, поэтому я думаю, что методы viewwillAppear и viewWillDisappear в любом случае являются правильным выбором. Ваше здоровье. - person nick; 01.08.2014

Если вы ранее вызывали removeObserver в viewDidUnload/dealloc/deinit, то, начиная с iOS 9.0 и macOS 10.11, вам больше не нужно его вызывать:

Если ваше приложение предназначено для iOS 9.0 и более поздних версий или macOS 10.11 и более поздних версий, вам не нужно отменять регистрацию наблюдателя в его методе Dealloc.

источник: https://developer.apple.com/documentation/foundation/notificationcenter/1413994-removeobserver

person Cœur    schedule 29.09.2018