Добавьте другую пару селектор / имя к существующему наблюдателю в NSNotificationCenter - PullRequest
0 голосов
/ 08 ноября 2011

Я не уверен в точной причине этого (кроме неоднозначности, описанной ниже), но я читал, что несколько наблюдателей не должны добавляться в NSNotificationCenter для одного и того же объекта. Однако я хотел бы добавить вторую пару селектор / имя к тому же объекту в центре уведомлений.

Я добавил первый следующим образом:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(method1:) 
                                             name:@"method1Notification"
                                           object:nil];
<ч />

Вариант 1:

Для добавления второго (как показано ниже) , похоже, снова добавляет "self" в центр уведомлений.

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

Это хорошо? Или, если необходимо, есть ли способ просто добавить еще одну пару селектор / имя к записи "self" в центре уведомлений по умолчанию?

<ч />

Вариант 2: (псевдокод)

[[[NSNotificationCenter defaultCenter] mySelfObserver]
                        addSelector:@selector(method2:) 
                               name:@"method2Notification"
                             object:nil];
<ч />

Неоднозначность:

Казалось бы, в любом случае, если его добавить еще раз, в dealloc: его, возможно, придется удалить как наблюдателя дважды?

[[NSNotificationCenter defaultCenter] removeObserver:self];
// ... REMOVE IT AGAIN IF OBSERVER ADDED TWICE TO NOTIFICATION CENTER?

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

Все, что вы разместили («Вариант 1»), в порядке. См. документы :

removeObserver:

Удаляет все записи, указывающие данного наблюдателя, из таблицы отправки получателя.

- (void)removeObserver:(id)notificationObserver

Вам просто нужно позвонить removeObserver: один раз; есть отдельный метод removeObserver:name:object:, если вы хотите удалить только одно соблюдение определенного уведомления.

0 голосов
/ 08 ноября 2011

Я думаю, вы немного смущены. Совершенно нормально добавлять данного наблюдателя любое количество раз, , если уведомления или объекты различаются .

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

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

- (void)registerForNotifications
{
    NSNotificationCenter * noteCenter = [NSNotificationCenter defaultCenter];
    [noteCenter addObserver:self
                   selector:@selector(keyboardWasShown:)
                       name:UIKeyboardDidShowNotification 
                     object:nil];

    [noteCenter addObserver:self
                   selector:@selector(keyboardWillBeHidden:)
                       name:UIKeyboardWillHideNotification 
                     object:nil];
    // Totally fine up to this point; this object is observing two different
    // notifications.
    // Now, add two different observations for the same notification, but
    // with _different_ objects:
    [noteCenter addObserver:self
                   selector:@selector(fluffyHasReproduced:)
                       name:RabbitsHaveReproducedNotification
                     object:MyRabbitFluffy];
    [noteCenter addObserver:self
                   selector:@selector(luckyHasReproduced:)
                       name:RabbitsHaveReproducedNotification
                     object:MyRabbitLucky];
    // This is fine; the appropriate rabbit notification method will only be
    // called when the corresponding rabbit reproduces.
    // However...
    // This will make luckyHasReproduced: be called _twice_ whenever
    // MyRabbitLucky posts RabbitsHaveReproducedNotification
    [noteCenter addObserver:self
                   selector:@selector(luckyHasReproduced:)
                       name:RabbitsHaveReproducedNotification
                     object:MyRabbitLucky];
    // Further,
    // this is probably not what you want. otherRabbitsHaveReproduced: is
    // going to be called whenever either Fluffy or Lucky post their
    // notifications, too. The nil object acts as a wildcard.
    [noteCenter addObserver:self
                   selector:@selector(otherRabbitsHaveReproduced:) 
                       name:RabbitsHaveReproducedNotification 
                     object:nil];

}

Позже, при необходимости (viewWillDisappear: или viewDidUnload: для контроллеров представления, в зависимости от характера уведомлений; dealloc для других объектов):

- (void) unregisterForNotifications {
    // Clear out _all_ observations that this object was making
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
...