Как помешать Обозревателю в NSNotification звонить дважды? - PullRequest
51 голосов
/ 13 октября 2011

У меня есть наблюдатель NSNotification, который вызывается дважды.Я не знаю, что с этим делать.

Я погуглил, но решение не найдено.

[[NSNotificationCenter defaultCenter] addObserver:self
     selector:@selector(connectedToServer:) name:@"ConnectedToServer" object:nil];

- (void)connectedToServer:(NSNotification*)notification {

    [[NSNotificationCenter defaultCenter] postNotificationName:@"SendMessageToServer" object:message];
}

Ответы [ 6 ]

124 голосов
/ 13 октября 2011

Решение 1: Прежде всего необходимо проверить, не было ли само сообщение отправлено дважды.

Решение 2: Даже если уведомление публикуется только один раз, действие будет вызываться столько раз, сколько вы добавили наблюдателя для уведомления (независимо от того, уведомление то же самое или нет). Например, следующие две строки зарегистрируют наблюдателя (self) для одного и того же уведомления (aSelector) дважды.

[[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];

Вы должны найти место добавления наблюдателя во второй раз и удалить его. А также убедитесь, что код, в который вы добавляете наблюдателя, не вызывается дважды.

Решение 3: Если вы не уверены, добавили ли вы уже наблюдателя или нет, вы можете просто сделать следующее. Это обеспечит добавление наблюдателя только один раз.

[[NSNotificationCenter defaultCenter] removeObserver:self name:aName object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];
15 голосов
/ 05 февраля 2014

Если ваш метод addObserver запущен несколько раз, он создаст несколько наблюдателей.Моя проблема заключалась в том, что я каким-то образом поместил своего наблюдателя в viewWillAppear, который появлялся несколько раз до того, как я разместил уведомление, и это привело к тому, что мой наблюдатель вызывался несколько раз.

Пока работает 3-е решение EmptyStack, есть причина, по которой выНаблюдатель вызывается дважды, поэтому, найдя его, вы можете предотвратить ненужные строки кода вместо удаления и добавления одного и того же наблюдателя.

Я бы предложил поместить вашего наблюдателя в viewDidLoad, чтобы избежать простых ошибок, таких какЯ испытал.

7 голосов
/ 15 февраля 2016

Попробуйте удалить Observer в viewWillDisappear метод:

-(void)viewWillDisappear:(BOOL)animated{

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"startAnimating" object:nil]; }
2 голосов
/ 01 июня 2016

Для тех, кто ищет решение в Swift 2.2 и выше и кто достиг такого вопроса, как я, вы можете создать расширение следующим образом:

import Foundation

extension NSNotificationCenter {
  func setObserver(observer: AnyObject, selector: Selector, name: String?, object: AnyObject?) {
    NSNotificationCenter.defaultCenter().removeObserver(observer, name: name, object: object)
    NSNotificationCenter.defaultCenter().addObserver(observer, selector: selector, name: name, object: object)
  }
}

Вы можете вызвать этот метод следующим образом:

NSNotificationCenter.defaultCenter().setObserver(self, selector: #selector(methodName), name: "name", object: nil)

Расширение будет обрабатывать удаление предыдущего наблюдателя, если оно существует. Даже если не было предыдущего наблюдателя, этот код не вылетел.

2 голосов
/ 09 мая 2013

Попробуйте установить точку останова на [[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil]; и проверить, вызывается ли она более одного раза.

0 голосов
/ 05 апреля 2019

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

...