NSNotificationCenter вызывает два раза

Ниже то, что у меня есть.

MainViewController.m

- (IBAction)sideMenuAction:(id)sender {
    NSLog(@"login==sideMenuAction");
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ShowMySideMenuNotification" object:self];
}

NotificationListener.m

-(void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ShowMySideMenuNotification" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(adjustShowMenu) name:@"ShowMySideMenuNotification" object:nil];
}

-(void) adjustShowMenu {
    NSLog(@"notification adjustShowMenu=");
}

Теперь, когда я нажимаю кнопку бокового меню в MainViewController, я ожидал один раз вызвать AdjustShowMenu из NotificationListener, однако он вызывается дважды.

Ниже приведен NSLog для того же.

2015-01-20 12:27:30.798 abc[699:169314] login==sideMenuAction
2015-01-20 12:27:30.798 abc[699:169314] notification adjustShowMenu=
2015-01-20 12:27:30.799 abc[699:169314] notification adjustShowMenu=

То, что я ожидал, это

2015-01-20 12:27:30.798 abc[699:169314] login==sideMenuAction
2015-01-20 12:27:30.798 abc[699:169314] notification adjustShowMenu=

Любая идея, что происходит не так?

Примечание. Я также пробовал использовать viewDidAppear вместо viewDidLoad, но результат тот же.

Когда я искал в Интернете, многие ответы просили удалить Observer. Я сделал то же самое, но все равно дважды вызывается уведомление.


person Fahim Parkar    schedule 20.01.2015    source источник
comment
Вы уверены, что у вас есть только один экземпляр NotificationListener? Я подозреваю, что должен быть еще один   -  person Andrey Chernukha    schedule 20.01.2015
comment
Это не то, как вы добавляете/удаляете наблюдателя. Вам нужно добавить его, когда вы хотите, и удалить его, когда закончите, например, добавить его в viewWillAppear и удалить в viewWillDisappear или viewDidLoad / dealloc.   -  person Simon McLoughlin    schedule 20.01.2015
comment
Привет. Пожалуйста, следуйте этому ответу, он решил мою проблему. stackoverflow.com/a/7751272/5581345   -  person Arshad Shaik    schedule 22.05.2019


Ответы (1)


Согласно ответу здесь, я вношу изменения, как показано ниже, и теперь все работает нормально.

-(void) viewWillAppear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(adjustShowMenu) name:@"ShowMySideMenuNotification" object:nil];
}

-(void) viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ShowMySideMenuNotification" object:nil];
}
person Fahim Parkar    schedule 20.01.2015
comment
Это лучший способ справиться с этим, потому что он будет работать, когда из этого вызываются дополнительные контроллеры представления И когда этот контроллер представления, который невидим в фоновом режиме, но все еще находится рядом, не хочет, чтобы эти уведомления были невидимыми. Если контроллеру представления все еще нужны уведомления, пока они не видны, но активны, ваше предложение не сработает. НО: как это решает его актуальную проблему селектора, вызываемого дважды? - person Hermann Klecker; 20.01.2015
comment
@HermannKlecker: bcz У меня был еще один контроллер представления (язык), прежде чем перейти к этому контроллеру представления (логин) ... 2 vc, поэтому 2 уведомления - person Fahim Parkar; 20.01.2015