(NSNotificationCenter)如何在不同的类中添加观察者?

时间:2013-06-14 18:51:10

标签: iphone ios objective-c nsnotificationcenter

如果我想在不同的类中添加观察者,有人可以解释如何使用通知中心吗?例如:在classA中发布通知。然后,添加两个观察者,一个在classB中,另一个在classC中,两个观察者都在等待相同的通知。

据我所知,我可以使用NSNotificationCenter发送和接收这样的通知。为了实现这一目标,我需要为每个类添加什么?

3 个答案:

答案 0 :(得分:6)

这正是通知中心的用途:它本质上是一个公告板,类可以发布其他类可能感兴趣的内容,而不必了解它们(或者关心是否有人真正感兴趣)。

所以有一个有趣的课程(你的问题中的A类)只是将通知发布到中央公告栏:

//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

您还可以在B和C类中实现上面@SEL()部分中指定的方法。一个简单的示例如下所示:

//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
}

答案 1 :(得分:2)

要发送通知,您需要致电

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

要接收通知,您需要致电

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

然后,要将该类作为观察者删除,可以使用

[[NSNotificationCenter defaultCenter] removeObserver:self];

另请参阅Apple's NSNotificationCenter documentation了解详情。

答案 2 :(得分:0)

那么问题是什么?你只需添加它们。这是关于通知的很酷的事情。发布通知时,每个观察者将执行自己的选择器。就是这样