Подтвердить что ты не робот

Как безопасно удалить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 не происходит никаких вызовов для металирования функций

И приложение вылетает

Как это сделать?

4b9b3361

Ответ 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/