何时创建自定义NSNotificationCenter?

时间:2013-06-11 15:03:17

标签: cocoa nsnotificationcenter

我一直在玩NSNotificationCenter而且我一直在想你何时会使用自己的自定义通知中心而不是defaultCenter?这有什么好处?

原谅我的无知,但似乎只是使用defaultCenter并且没有其他任何东西我可以相处得很开心,但我想确保我没有错过任何重要的东西。

3 个答案:

答案 0 :(得分:11)

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

  

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

完整来源:NSNotificationCenter documentation

但是,每个通知中心都可以处理通过名称和对象区分的通知网络。添加观察者时,通常以某种方式调用该方法:

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

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

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

这种方式表示您使用N个名称和M个对象,您可以处理N * M个区别通知。我认为没有必要使用两个通知中心。从理论上讲,如果你已经完成了所有名称,你可以使用alloc + init创建另一个名称,但我几乎看不到它实际上是如何变得方便的。

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

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

答案 1 :(得分:8)

虽然它在AppKit中通过defaultCenter单例访问器大量使用,但在它的核心,NSNotificationCenter实际上只是一种“通用的解耦机制”。允许你alloc/init你自己的实例只是这种泛型的表达。如果你想将它用于别的东西,你可以。

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

我在创建NSNotificationCenter的独立实例时看到的主要用例是,您希望并行运行多个线程上的某些复杂子系统的多个实例,而不会让它们因跨线程通知而混淆。在这种情况下,一般模式是为每个线程分配一个NSNotificationCenter。这将每个对象网络的通知划分为单个线程。如果观察者通过nil传递对象参数,通常需要使用给定名称来监听所有通知,而不考虑来源。

所有这一切,我承认,根据我的经验,制作NSNotificationCenter的私人实例非常罕见。

答案 2 :(得分:0)

Apple's Doc

如果您的应用广泛使用通知,则可能要创建并发布到自己的通知中心,而不是仅发布到默认通知中心。将通知发布到通知中心时,通知中心将扫描已注册观察者的列表,这可能会使您的应用变慢。通过围绕一个或多个通知中心功能性地组织通知,每次发布通知时所做的工作都更少,这可以提高整个应用程序的性能。