是的,一个对象可以收听任意数量的通知。NSNotificationCenter 实际上是一个哈希映射(在逻辑级别,而不是在其实现中)。它将通知的名称与将处理它的对象和选择器(对象响应通知的功能)相关联。事实上,许多操作系统功能都是基于 NSNotificationCenter 的,例如当 iOS 上的应用程序进入后台或进入前台时发布的默认通知。您可以在通知中心注册任意数量的对象,以及任意数量的回调。
然而,一个更合适的问题是:你真的想要吗?
如果过度使用/误用,NSNotificationCenter 可能会出现多线程问题。请记住,如果您仅基于 NSNotificationCenter 的发送者-侦听器模式,您可能会发现自己正在寻找导致难以发现和重现崩溃的错误。当然,有 'addObserverForName:object:queue:usingBlock:' 函数可以让你对想要调用回调的线程有更多的控制,但在这种情况下,除非你开始传递对象参数(那些使用 self .myVar) 使用 '__weak __block' 强制转换,您可能有内存泄漏。更不用说随着程序的增长,您将不得不注意什么线程发布通知,以及它将在哪里处理以避免多线程问题。在这种情况下,
说到不可读的代码,NSNotificationCenter 可以很容易地使您的应用程序无法维护。想象一下,如果你只基于回调函数会发生什么。您将有一个意大利面条程序,其中充满了您无法弄清楚它们要去哪里的回调(您必须对每个回调进行全文搜索)。
所以,如果我被要求给出一个简单的设计考虑,我会说你应该使用 NSNotificationCenter 只有当你的设计中有一个通知可能由零个或多个不需要与逻辑相关的对象回答时彼此,或触发通知的对象。对于任何其他情况,我建议查看委托模式,Objective C 处理得非常好。
我知道这超出了您的要求,但我不能只回答“是的,根据需要放置尽可能多的通知观察者”而不讨论这样做的含义。
顺便说一句,您正在使用一个通用名称注册多个回调。不应为同一类中的许多回调使用通用名称。如果你想让同一个通知在同一个对象中调用多个函数,只需将该对象注册一次,然后在回调函数中调用你要调用的其余函数。