Как безопасно удалитьObserver (Swift)
Я добавил наблюдателя
override func viewDidLoad()
{
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector:"selector name", name: "observer name", object:nil)
...
}
При удалении наблюдателя в deinit,
deinit
{
NSNotificationCenter.defaultCenter().removeObserver(self, forKeyPath: <some string>)
}
приложение иногда аварийно завершает:
Завершение приложения из-за неперехваченного исключения "NSRangeException", причина: "Невозможно удалить класс наблюдателя" для ключевого пути "некоторая строка" из NSNotificationCenter, потому что он не зарегистрирован как наблюдатель.
Итак, я пытаюсь добавить do/catch
deinit
{
do{
try NSNotificationCenter.defaultCenter().removeObserver(self, forKeyPath: <some string>)
}catch{}
}
Но я получаю предупреждение:
блок catch недоступен, поскольку в блоке do не выполняются ошибки
И приложение вылетает
и когда я добавляю попытку
deinit
{
do{
try NSNotificationCenter.defaultCenter().removeObserver(self, forKeyPath: <some string>)
}catch{}
}
Я получаю это предупреждение:
в try expresion не происходит никаких вызовов для металирования функций
И приложение вылетает
Как это сделать?
Ответы
Ответ 1
Я думаю, вы должны использовать код
NSNotificationCenter.defaultCenter().removeObserver(self)
Объясните:
У вас есть ошибка здесь: вы используете NSNotification и NSNotificationCenter, поэтому вам нужно использовать этот код, чтобы удалить наблюдение.
у вас есть код для KVO, чтобы удалить наблюдателя, чтобы он был неправильным.
Более подробную информацию вы можете прочитать здесь. Key-Value-Observing
Ответ 2
Если вы поддерживаете версии iOS на 9.0, вам не нужно удалять наблюдателей самостоятельно в методе deinit
.
Взято из документации
В OS X 10.11 и iOS 9.0 NSNotificationCenter и NSDistributedNotificationCenter больше не будет отправлять уведомления зарегистрированных наблюдателей, которые могут быть освобождены.
https://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/