当您发布通知时,将通知所有注册观察者。他们通过向他们发送一条消息来获得通知……选择器标识的消息。如评论中所述,您不应使用viewDidLoad
. 考虑这个...
- (void)newDataNotification:(NSNotification *notification) {
// Do whatever you want to do when new data has arrived.
}
在一些早期代码中(viewDidLoad 是一个很好的候选):
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(newDataNotification:)
name:@"New data"
object:nil];
这是一个可怕的名字,顺便说一句。那好吧。此注册表明,只要使用任何对象的名称发布通知,您的self
对象就会收到newDataNotification:
带有对象的消息。如果要限制要从哪个对象接收消息,请提供非零值。NSNotification
"New data"
现在,当您发送通知时,您可以简单地执行此操作,就像您在代码中所做的那样:
[[NSNotificationCenter defaultCenter] postNotificationName:@"New data" object:nil];
这将确保(出于实际目的)[self newDataNotification:notification]
被调用。现在,您也可以连同通知一起发送数据。因此,假设新数据由 表示newDataObject
。由于您接受来自任何对象的通知,因此您可以:
[[NSNotificationCenter defaultCenter]
postNotificationName:@"New data"
object:newDataObject];
然后在你的处理程序中:
- (void)newDataNotification:(NSNotification *notification) {
// Do whatever you want to do when new data has arrived.
// The new data is stored in the notification object
NewData *newDataObject = notification.object;
}
或者,您可以传递用户信息字典中的数据。
[[NSNotificationCenter defaultCenter]
postNotificationName:@"New data"
object:nil
userInfo:@{
someKey : someData,
anotherKey : moreData,
}];
然后,您的处理程序将如下所示...
- (void)newDataNotification:(NSNotification *notification) {
// Do whatever you want to do when new data has arrived.
// The new data is stored in the notification user info
NSDictionary *newData = notification.userInfo;
}
当然,您可以使用我更喜欢的块 API 来做同样的事情。
无论如何,请注意您必须移除您的观察者。如果你有一个viewDidUnload
,你应该把它放在那里。此外,确保它也进入dealloc
:
- (void)dealloc {
// This will remove this object from all notifications
[[NSNotificationCenter defaultCenter] removeObserver:self];
}