0

我的主要课程可以听很多通知吗?例如 :

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(touched:) name:@"touch" object:nil];

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(done:) name:@"touch" object:nil];

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(error:) name:@"touch" object:nil];

我的主要课程是听她的许多孩子的消息。代表的工作太多了,所以我试图逃避它。

4

3 回答 3

2

是的,一个对象可以收听任意数量的通知。NSNotificationCenter 实际上是一个哈希映射(在逻辑级别,而不是在其实现中)。它将通知的名称与将处理它的对象和选择器(对象响应通知的功能)相关联。事实上,许多操作系统功能都是基于 NSNotificationCenter 的,例如当 iOS 上的应用程序进入后台或进入前台时发布的默认通知。您可以在通知中心注册任意数量的对象,以及任意数量的回调。

然而,一个更合适的问题是:你真的想要吗?

如果过度使用/误用,NSNotificationCenter 可能会出现多线程问题。请记住,如果您仅基于 NSNotificationCenter 的发送者-侦听器模式,您可能会发现自己正在寻找导致难以发现和重现崩溃的错误。当然,有 'addObserverForName:object:queue:usingBlock:' 函数可以让你对想要调用回调的线程有更多的控制,但在这种情况下,除非你开始传递对象参数(那些使用 self .myVar) 使用 '__weak __block' 强制转换,您可能有内存泄漏。更不用说随着程序的增长,您将不得不注意什么线程发布通知,以及它将在哪里处理以避免多线程问题。在这种情况下,

说到不可读的代码,NSNotificationCenter 可以很容易地使您的应用程序无法维护。想象一下,如果你只基于回调函数会发生什么。您将有一个意大利面条程序,其中充满了您无法弄清楚它们要去哪里的回调(您必须对每个回调进行全文搜索)。

所以,如果我被要求给出一个简单的设计考虑,我会说你应该使用 NSNotificationCenter 只有当你的设计中有一个通知可能由零个或多个不需要与逻辑相关的对象回答时彼此,或触发通知的对象。对于任何其他情况,我建议查看委托模式,Objective C 处理得非常好。

我知道这超出了您的要求,但我不能只回答“是的,根据需要放置尽可能多的通知观察者”而不讨论这样做的含义。

顺便说一句,您正在使用一个通用名称注册多个回调。不应为同一类中的许多回调使用通用名称。如果你想让同一个通知在同一个对象中调用多个函数,只需将该对象注册一次,然后在回调函数中调用你要调用的其余函数。

于 2013-10-28T08:39:17.577 回答
0

A. 是否存在复制和粘贴错误?您将同一个观察者的三个方法注册到同一个通知。您可以简单地注册一种“调用”其他方法的方法。所以没有理由去做,你想做的事。

B. 通知和委托之间的区别不是线程。默认情况下,两者都在外部线程上执行。(如果你愿意,你可以很容易地改变它,但两者都需要再次改变。)

C. 真正的区别在于通知是间接的,而委托消息是定向的。通知发送者可能面临未知数量的未知接收者。委托对象与特定委托一起工作。您可以将此与通知(非交互式)广播电视进行比较。委派为交互式 IP-TV。(好吧,这被简化了。)结果是委托可以改变委托对象的行为,而通知观察者(哪个?)不能改变通知发送者的行为。

如果您的设计中有特定的对象伙伴关系,您真的应该使用委托。或多或少的工作绝对没有理由改变这个职位。(而且我认为这甚至不是真的。)

于 2013-10-28T08:17:21.033 回答
0

简短的回答是肯定的。您可以根据需要注册尽可能多的通知。

请确保您至少从 dealloc 中的通知中心删除 self 。

(你也可以暂时观察通知,但听起来你还没有)

于 2013-10-28T09:32:19.567 回答