如何使用NSNotification。

8

我理解通知、发布者和观察者的概念。

但我不太明白我们的应用程序或操作系统如何理解并向观察者类发送标志/通知?

这背后的机制是什么?

非常感谢您的答复和帮助。

谢谢

ID。

4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
7
想象一下通知中心就像一个字典,它有通知名称的键和观察者列表(以及它们指定的操作方法)的值。当发布通知时,获取该通知名称的观察者列表并进行迭代。每个观察者都会调用其操作方法来处理通知信息。 此外,在迭代过程中,还会检查通知对象是否与观察者感兴趣(基于添加观察者时提供的参数)。 通知过程在发布通知的线程上执行。 不要尝试依赖任何与添加观察者的方式和时间相关的隐含顺序。

那么,如果我发布一个有'n'个观察者的通知,是否会导致内部循环迭代'n'次? - Gokul

4
基本上,NotificationCenter 会保留已注册为观察者的任何对象的引用。通过该引用,它还会跟踪该对象想要的通知类型。 当一个对象发布通知时,中心会通过发送带有该选择器的消息来将其传递给每个已注册的观察者。 默认的中心通常是一个全局单例。但是,您可以创建自己的中心,也许是因为您想确保您的通知对您的应用程序是私有的。

我们如何创建自己的通知? - Bhupesh
1
可以通过子类化或不使用类工厂方法来实现。 - uchuugaka

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方法中取消观察者。

0

加深你的理解,这对我来说需要一些时间才能消化。虽然它没有告诉我们内部是如何工作的,但它告诉了我们它是如何实现工作的。

在多线程应用程序中,通知总是在发布通知的线程中传递,这可能不是观察者注册自身的同一线程。

来源:苹果文档

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,