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

Как остановить Observer в NSNotification для вызова дважды?

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

Я искал его, но решения не найдено.

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

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

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

Ответ 1

Решение 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];

Ответ 2

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

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

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

Ответ 3

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

-(void)viewWillDisappear:(BOOL)animated{

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"startAnimating" object:nil]; }

Ответ 4

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

Ответ 5

Для тех, кто ищет решение в 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)

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

Ответ 6

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

Ответ 7

Может быть, ваш viewDidLoad вызывается дважды.

Попробуйте узнать, может ли этот ответ помочь вам: fooobar.com/info/14286088/...