0


上周我问了这个问题:刷新整个 iOS 应用 @Jim 建议我使用通知中心。我无法弄清楚如何处理通知,我被告知要问另一个问题,我尝试了整整一周自己解决问题,所以就这样吧。

我有一个包含多个子视图的视图。其中一个子视图是一个搜索栏(不是表格视图,只是一个自定义文本框),用户可以在这里搜索一个新人,整个应用程序将逐屏更新。

当用户点击搜索子视图中的 GO 按钮时,我会调用服务器以获取所有数据。之后我发布此通知:

 [self makeServerCalls];

[[NSNotificationCenter defaultCenter] postNotificationName:@"New data" object:Nil];

现在在我的父视图控制器的初始化中,我有一个监听器

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDidLoad) name:@"New data" object:nil];

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

感谢你给与我的帮助。

4

1 回答 1

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];

这是一个可怕的名字,顺便说一句。那好吧。此注册表明,只要使用任何对象的名称发布通知,您的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];
}
于 2012-09-07T23:18:36.647 回答