NSNotification如何运作

时间:2013-06-30 07:50:53

标签: ios objective-c nsnotificationcenter nsnotifications

我理解通知,海报和观察者的内容。

但我完全无法理解我们的应用或操作系统如何理解并将标志/通知发送给观察者类?

这背后的机制是什么?

您的回答和帮助将受到很多赞赏。

由于

ID

4 个答案:

答案 0 :(得分:6)

将Notification Center想象成一个字典,其中包含通知名称和观察者列表值(及其指定的操作方法)的键。发布通知时,将获取并迭代该通知名称的观察者列表。每个观察者都使用通知信息调用其动作方法。

此外,在迭代期间,检查以确定观察者是否感兴趣通知对象(基于添加观察者时提供的参数)。

通知流程在发布通知的主题上执行。

不要考虑依赖任何与添加观察者的方式和时间有关的隐含命令。

答案 1 :(得分:4)

NotificationCenter基本上保留对注册为观察者的任何对象的引用。通过该引用,它还可以跟踪对象想要的通知类型。 当对象发布通知时,中心通过向观察者发送带有该选择器的消息将其传递给每个注册的观察者。

默认中心通常是全局单身人士。但您可以创建自己的,也许您希望确保您的通知对您的应用是私有的。

答案 2 :(得分:1)

为了发送通知,对象发送:

[[NSNotificationCenter defaultCenter] postNotificationName:@"notif_key" object:nil userInfo:userDict];

现在,每个听到名为@“notif_key”的通知的生物都可以做一些动作。

你如何让一个对象听?

需要运行:

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

当第一个对象发送通知时,观察者对象将运行'doSomething:'方法。

注意:

  • userDict是一个字典,您可以向这些观察者发送一些信息。
  • 不要忘记在dealloc方法中取消观察者。

答案 3 :(得分:0)

添加到您的理解中,这需要一些时间让我消化到我的头脑中。虽然它没有告诉它内部如何工作,但它告诉它如何实现工作

在多线程应用程序中,通知始终在发布通知的线程中传递,可能与观察者注册的线程不同。

来源:apple documentation

因此通知可以在任何线程中注册,但与通知相关联的方法在发布通知的线程上运行,因此如果我们要对UI进行任何更改,我们会将其发送到主线程