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

Удаление всех наблюдателей из одного места

Я хочу удалить наблюдателя уведомлений, и я использую метод:

removeObserver: name:@"myNotification" object:nil

для этого. Сейчас есть много наблюдателей, которые слушают это уведомление, и я хочу удалить их все за один снимок из централизованного места. Могу ли я передать "nil" в первом параметре, и он удалит всех наблюдателей, которые слушают myNotification?

4b9b3361

Ответ 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 для хранения состояния глобального приложения, которое не сохраняется. Если он сохраняется, используйте любой метод, который вы используете для другого состояния.