(NSNotificationCenter) Как добавить наблюдателей в разные классы?

Может кто-нибудь объяснить, как использовать центр уведомлений, если я хочу добавить наблюдателей в разных классах? Например: опубликовать уведомление в классе А. Затем добавьте двух наблюдателей, одного в классе B, а другого в classC, оба ожидают одного и того же уведомления.

Я понимаю, что могу использовать NSNotificationCenter для отправки и получения таких уведомлений. Что мне нужно добавить в каждый класс, чтобы достичь этого?

3 ответа

Решение

Это именно то, для чего предназначен центр уведомлений: это, по сути, доска объявлений, где классы могут публиковать материалы, которые могут заинтересовать другие классы, без необходимости их знать (или не заботиться, если кто-то действительно заинтересован).

Итак, класс, которому есть что рассказать (класс А из вашего вопроса), просто публикует Уведомление на центральной доске объявлений:

//Construct the Notification
NSNotification *myNotification = [NSNotification notificationWithName:@"SomethingInterestingDidHappenNotification"
                                                               object:self //object is usually the object posting the notification
                                                             userInfo:nil]; //userInfo is an optional dictionary

//Post it to the default notification center
[[NSNotificationCenter defaultCenter] postNotification:myNotification];

В каждом классе, который заинтересован в получении уведомлений (классы B и C в вашем вопросе), вы просто добавляете себя в качестве наблюдателя в центр уведомлений по умолчанию:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@SEL(methodYouWantToInvoke:) //note the ":" - should take an NSNotification as parameter
                                             name:@"SomethingInterestingDidHappenNotification" 
                                           object:objectOfNotification]; //if you specify nil for object, you get all the notifications with the matching name, regardless of who sent them

Вы также реализуете метод, указанный в @SEL() часть выше в ваших классах B и C. Простой пример будет выглядеть так:

//The method that gets called when a SomethingInterestingDidHappenNotification has been posted by an object you observe for
- (void)methodYouWantToInvoke:(NSNotification *)notification
{
    NSLog(@"Reacting to notification %@ from object %@ with userInfo %@", notification, notification.object, notification.userInfo);
    //Implement your own logic here
}

Чтобы отправить уведомление, вы хотите позвонить

[[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationName" object:nil];

Чтобы получить уведомление, вам нужно позвонить

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

а затем, чтобы удалить этот класс в качестве наблюдателя, вы можете использовать

[[NSNotificationCenter defaultCenter] removeObserver:self];

Также см . Документацию Apple NSNotificationCenter для получения подробной информации.

Так в чем проблема? Вы просто добавляете их всех. Это крутая вещь об уведомлениях. Когда уведомление публикуется, каждый наблюдатель будет выполнять свой собственный селектор. это оно

Другие вопросы по тегам