上周我问过这个问题:Refresh the entire iOS app
@Jim建议我使用通知中心。我无法弄清楚如何使用通知,我被告知要问另一个问题,我试着整整一周自己解决这个问题,所以就这样了。
我有一个包含多个子视图的视图。其中一个子视图是搜索栏(不是桌面视图,只是一个自定义文本框),用户可以在此搜索新人,整个应用程序将逐屏幕更新。
当用户点击搜索子视图中的GO按钮时,我打电话给服务器以获取所有数据。之后我发布了这个通知:
[self makeServerCalls];
[[NSNotificationCenter defaultCenter] postNotificationName:@"New data" object:Nil];
现在在我的父视图控制器的init中,我有一个监听器
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDidLoad) name:@"New data" object:nil];
我知道这很可能是错误的,所以有人可以向我解释如何在我的情况下正确使用通知吗?或者,如果有更好的方式做我想做的事。
感谢您提供任何帮助。
答案 0 :(得分:3)
发布通知时,会通知所有注册观察者。通过向他们发送消息来通知他们......由选择器标识的消息。如评论中所述,您应不使用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];
这是一个可怕的名字,BTW。那好吧。此注册表示,只要从任何对象发布名称为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];
}