到目前为止,我一直在使用方法postNotification:aString object:anyObjectOfInterestForTheReceiver
的NSNotificationCenter。但最近我在文档中读到object
字段只应传递self
。是否有任何可怕的副作用,我不知道应该说服我将来只通过self
,还是可以通过任何对象?
谢谢!
答案 0 :(得分:7)
您可以将任何对象作为通知的object
传递,但约定是object
是“正在做通知的事情”(并且您将其他相关状态放在{ {1}}字典)。
它主要是userInfo
的原因是因为通常做通知的对象通常想要引用它自己。这样,例如,如果您有许多self
个对象,其中一个已完成任务并发送了通知,那么观察通知的任何人都可以查看Foo
以查看哪个object
是有问题的那个。当您遵循此方案时,观察者还可以选择仅观察来自特定Foo
的通知。
在发布通知时使用除“self”之外的内容也是合理的(尽管不太常见) - 假设您“代表”另一个对象发送通知。例如,您可以是完成Foo
任务的单例控制器对象,您可以通过引用特定Bar
作为对象来发送通知。这比使用单身作为Bar
更有意义,因为那里没有有趣的变化。
同样,这只是一个(有用的)惯例。当您编写自己的通知时,您可以定义通知的“合同”,即名称,用作object
的对象类型以及object
中的内容。 / p>
答案 1 :(得分:2)
是的,我能想到一个副作用。让我解释一下。
您谈到的方法实际上是在NSNotification.h中定义的,如下所示:
第一个参数notificationName代表通知的名称。 第二个参数notificationSender代表发布通知的对象。
是的,任何对象都可以是通知发送者,即使是零也可以。
在观察通知(成为特定通知的观察者)方面,我们了解了NSNotification中定义的另一种方法:
如您所见,最后一个参数是notificationSender(观察者想要接收其通知的对象)。
现在,副作用显然是正确的。让我详细解释一下。例如,有三个控制器A,B,C.控制器A发布通知helloEveryone。控制器B还发布通知helloEveryone 在C控制器中,如果您放置如下语句:
[[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(helloEveryOne)name:@“helloEveryone”object:nil]
然后你将从控制器A和控制器B收到两个helloEveryone。 如果你发表这样的声明:
[[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(helloEveryOne)name:@“helloEveryone”object:controllerA]
然后,您将只从控制器A收到一个helloEveryone。
自我肯定不是零通知发件人,只要它可以发布通知,但使用其他对象作为通知发件人,可能是一个零对象。并且观察者的行为在通知发送者是否为零时是不同的。
答案 2 :(得分:1)
如果事件真的有发件人,这一点至关重要。
注册观察者时,您可以指定要观察的发件人。如果您让其他人使用您的邮件,那么正确传递发件人或绑定到特定发件人的观察者将无法收到您的邮件至关重要。