23

我一直在玩NSNotificationCenter,我一直想知道你什么时候会使用自己的自定义通知中心而不是defaultCenter?这样做的好处是什么?

原谅我的无知,但似乎我可以很开心地只使用 thedefaultCenter而不是其他东西,但我想确保我不会错过一些重要的东西。

4

3 回答 3

14

Apple 文档含糊不清,它只是指出通常程序员不需要创建新文档:

每个运行的 Cocoa 程序都有一个默认的通知中心。您通常不会创建自己的。NSNotificationCenter 对象只能在单个程序中传递通知。

完整来源:NSNotificationCenter 文档

然而,每个通知中心都可以处理由名称和对象区分的通知网络。当您添加观察者时,您通常会以如下方式调用该方法:

[center addObserver: self selector: @selector(observe:) name: @"observe" object: someObject];

当您发布通知时,您可以指定对象:

[center postNotificationName: @"observe" object: someObject];

这种方式说你使用 N 个名字和 M 个对象,你可以处理 N*M 个区分通知。我认为没有必要使用两个通知中心。理论上,如果你完成了所有的名字,你可以使用 alloc+init 创建另一个名字,但我几乎看不出它实际上如何变得很方便。

还要考虑当有两个对象不拥有彼此的直接指针时经常使用通知中心(否则为什么不简单地调用它的方法呢?),因为避免复杂的绑定(特别是当你使用很多 xib 时)文件),因此拥有一个独特的通知中心对象非常方便。

如果改为使用通过 allot+init 获得的通知中心,则必须确保所有通信对象都有指向该通知中心的指针,这会增加一些复杂性。通知中心的所有力量都将被浪费掉。

于 2013-06-11T15:53:32.843 回答
8

虽然它通过defaultCenter单例访问器在 AppKit 中大量使用,但从本质上讲,NSNotificationCenter 只是一个“通用解耦机制”。允许您使用alloc/init自己的实例只是这种通用性的一种表达。如果您想将其用于其他用途,则可以。

用一个有点荒谬的例子来说明,这样想: NSDocument 有一个windowControllers访问器,它返回一个特定的、有福的、重要的 NSArray 实例,其中包含对该文档特定的所有窗口控制器的引用。也就是说,NSArray 只是一个“通用列表数据结构”。仅仅因为存在具有特定目的的它的特殊实例并不意味着将 NSArray 重用于您自己的目的可能没有用。NSArray 和 NSNotificationCenter 都提供了通用的数据结构/构建块,它们的特定实例用于 AppKit 周围的祝福“职业”,但它们都可以单独使用。

我见过的创建 NSNotificationCenter 独立实例的主要用例是,当您希望在多个线程上并行运行某个复杂子系统的多个实例并且不让它们可能被跨线程通知混淆时。在这种情况下,一般模式是为每个线程分配一个 NSNotificationCenter。这将每个对象网络的通知划分为单个线程。nil如果观察者传递的对象参数旨在侦听具有给定名称的所有通知,则通常需要这样做,而不管来源如何。

尽管如此,我承认,根据我的经验,制作 NSNotificationCenter 的私有实例非常罕见。

于 2013-06-11T16:33:42.317 回答
0

苹果的文档

如果您的应用广泛使用通知,您可能希望创建并发布到您自己的通知中心,而不是仅发布到默认通知中心。当通知发布到通知中心时,通知中心会扫描已注册的观察者列表,这可能会降低您的应用程序的速度。通过围绕一个或多个通知中心在功能上组织通知,每次发布通知时完成的工作更少,这可以提高整个应用程序的性能。

于 2020-02-13T22:23:33.970 回答