Jim*_*ery 18 cocoa nsnotificationcenter
我一直在玩这个NSNotificationCenter,我一直在想你何时会使用自己的自定义通知中心而不是defaultCenter?这有什么好处?
原谅我的无知,但似乎我可以相当愉快地相处,只是使用defaultCenter其他东西,但我想确保我没有错过一些重要的东西.
Ram*_*uri 11
Apple文档含糊不清,它只是说程序员通常不需要创建一个新文档:
每个运行的Cocoa程序都有一个默认的通知中心.您通常不会创建自己的.NSNotificationCenter对象只能在单个程序中传递通知.
完整来源:NSNotificationCenter文档.
但是,每个通知中心都可以处理通过名称和对象区分的通知网络.添加观察者时,通常以某种方式调用该方法:
[center addObserver: self selector: @selector(observe:) name: @"observe" object: someObject];
Run Code Online (Sandbox Code Playgroud)
当您发布通知时,您可以指定对象:
[center postNotificationName: @"observe" object: someObject];
Run Code Online (Sandbox Code Playgroud)
这种方式表示您使用N个名称和M个对象,您可以处理N*M个区别通知.我认为没有必要使用两个通知中心.从理论上讲,如果你已经完成了所有名称,你可以使用alloc + init创建另一个名称,但我几乎看不到它实际上是如何变得方便的.
还要考虑当有两个对象没有彼此直接指针时通常会使用通知中心(否则为什么不简单地调用它上面的方法?),因为避免了复杂的绑定(特别是当你使用大量的xib时)文件),因此拥有一个独特的通知中心对象非常方便.
如果您使用通过allot + init获取的通知中心,那么您必须确保所有通信对象都有指向该通知中心的指针,这会增加一些复杂性.所有通知中心的权力都将被浪费.
尽管它通过defaultCenter单例访问器在AppKit中大量使用,但在它的核心,NSNotificationCenter实际上只是一种"通用的解耦机制".允许你alloc/init自己的实例只是这种泛型的表达.如果你想把它用于别的东西,你可以.
为了说明一个有点荒谬的例子,可以这样思考:NSDocument有一个windowControllers访问器,它返回一个特定的,有福的,重要的NSArray实例,它包含对特定于该文档的所有窗口控制器的引用.也就是说,NSArray只是一个"通用列表数据结构".仅仅因为存在具有特定目的的它的特殊实例并不意味着为了您自己的目的重用NSArray可能没有用.NSArray和NSNotificationCenter都提供通用数据结构/构建块,其特定实例用于围绕AppKit的祝福"职业",但两者都可以自己使用.
我在创建NSNotificationCenter的独立实例时看到的主要用例是,您希望并行运行多个线程上的某些复杂子系统的多个实例,而不会让它们被跨线程通知混淆.在这种情况下,一般模式是为每个线程分配一个NSNotificationCenter.这将每个对象网络的通知划分为单个线程.如果观察者传递nil的是想要侦听具有给定名称的所有通知的对象参数,则通常需要这样做,而不管源是什么.
总而言之,我承认,根据我的经验,制作NSNotificationCenter的私人实例非常罕见.