NSnotification中心不适用于iOS

时间:2012-09-07 21:31:45

标签: ios search uiview nsnotificationcenter


上周我问过这个问题: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];

我知道这很可能是错误的,所以有人可以向我解释如何在我的情况下正确使用通知吗?或者,如果有更好的方式做我想做的事。

感谢您提供任何帮助。

1 个答案:

答案 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];
}