Удаление всех наблюдателей из одного места
Я хочу удалить наблюдателя уведомлений, и я использую метод:
removeObserver: name:@"myNotification" object:nil
для этого. Сейчас есть много наблюдателей, которые слушают это уведомление, и я хочу удалить их все за один снимок из централизованного места. Могу ли я передать "nil" в первом параметре, и он удалит всех наблюдателей, которые слушают myNotification?
Ответы
Ответ 1
Вы можете полностью удалить объект из центра уведомлений, что означает, что никакие уведомления не будут активированы. Например, когда у меня есть контроллер просмотра, зарегистрированный для уведомлений, я включаю эту строку в мой dealloc.
[[NSNotificationCenter defaultCenter] removeObserver:self];
Это на уровне объекта... поэтому он будет отменить регистрацию для многих уведомлений. Он не будет отменить регистрацию для одного уведомления во многих объектах.
Надеюсь, я правильно понял ваш вопрос.
Ответ 2
В случае Swift вы делаете это так:
NSNotificationCenter.defaultCenter().removeObserver(self)
И в Swift 3:
NotificationCenter.default.removeObserver(self)
Ответ 3
К сожалению, нет способа удалить всех наблюдателей определенного уведомления в одном месте. Хотя, конечно, случаи, когда это было бы хорошо, было бы опасно делать так, как обычно, объект, выполняющий наблюдение, должен нести ответственность за добавление и удаление себя в качестве наблюдателя определенного уведомления. Это не гарантирует непредсказуемого поведения. Наблюдатели b/c могут приходить и уходить, поэтому они настраиваются и очищаются после себя.
Если объект, который генерирует уведомления, уходит, это не имеет никакого значения для наблюдателя, поскольку наблюдатель не знает об этом объекте в любом случае. Это просто означает, что объект не будет генерировать больше уведомлений.
[РЕДАКТИРОВАТЬ: ОТВЕТ НА ВАШ КОММЕНТАРИЙ КЛАСС B ОСТАНОВКА КЛАССА ОТ НАБЛЮДЕНИЙ]
Я только что видел ваш комментарий. Существуют различные способы достижения этого, особенно если класс B знает о классе A. Как вы ссылаетесь на классы, это звучит так, как будто вы хотите воздействовать на все экземпляры класса против конкретного экземпляра. Если у вас есть какое-то условие, которое вы можете проверить при обращении с уведомлением, как я подхожу к этому. В обработчике уведомлений что-то вроде:
if ([self shouldRespondToNotificationNamed:notification.name]) {
[self performNotificationAction];
}
Если у вас нет условия, которое вы можете проверить, создайте его либо в соответствующем классе, либо в iVar, либо в том месте, где вы можете получить доступ к нему по всему миру для всех экземпляров класса. Обычно я использую singleton для хранения состояния глобального приложения, которое не сохраняется. Если он сохраняется, используйте любой метод, который вы используете для другого состояния.