(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 для получения подробной информации.
Так в чем проблема? Вы просто добавляете их всех. Это крутая вещь об уведомлениях. Когда уведомление публикуется, каждый наблюдатель будет выполнять свой собственный селектор. это оно