将另一个选择器/名称对添加到 NSNotificationCenter 中的现有观察者中
我不确定其确切原因(除了下面描述的歧义之外),但我读到不应将多个观察者添加到同一对象的 NSNotificationCenter 中。但是,我想将第二个选择器/名称对添加到通知中心中的同一对象。
我添加了第一个,如下所示:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(method1:)
name:@"method1Notification"
object:nil];
选项 1:
添加第二个 (如下所示) 似乎会再次将“self
”添加到通知中心。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(method2:)
name:@"method2Notification"
object:nil];
这样可以吗?或者,如果有必要,是否有一种方法可以简单地将另一个选择器/名称对添加到默认通知中心的“self
”条目中?
选项 2:(伪代码)
[[[NSNotificationCenter defaultCenter] mySelfObserver]
addSelector:@selector(method2:)
name:@"method2Notification"
object:nil];
歧义:
无论哪种方式,如果在 dealloc:
中第二次添加它,它可能需要作为观察者被删除两次?
[[NSNotificationCenter defaultCenter] removeObserver:self];
// ... REMOVE IT AGAIN IF OBSERVER ADDED TWICE TO NOTIFICATION CENTER?
I'm not sure the exact reason for it (other than the ambiguity described below), but I've read that multiple observers shouldn't be added to the NSNotificationCenter for the same object. However, I would like to add a second selector/name pair to the same object in the notification center.
I added the first one as follows:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(method1:)
name:@"method1Notification"
object:nil];
Option 1:
To add the second (like below) would seem to add "self
" to the notification center again.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(method2:)
name:@"method2Notification"
object:nil];
Is this okay? Or, if necessary, is there a way to simply add another selector/name pair to the "self
" entry in the default notification center?
Option 2: (Pseudocode)
[[[NSNotificationCenter defaultCenter] mySelfObserver]
addSelector:@selector(method2:)
name:@"method2Notification"
object:nil];
Ambiguity:
It would seem that either way, if it were added a second time, in dealloc:
it might need to be removed as an observer twice?
[[NSNotificationCenter defaultCenter] removeObserver:self];
// ... REMOVE IT AGAIN IF OBSERVER ADDED TWICE TO NOTIFICATION CENTER?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您发布的所有内容(“选项 1”)都可以。请参阅文档:
您只需调用
removeObserver:
一次;如果您只想删除对特定通知的单个观察,可以使用单独的removeObserver:name:object:
方法。Everything you posted ("Option 1") is okay. See the docs:
You just need to call
removeObserver:
once; there's a separateremoveObserver:name:object:
method if you want to remove just a single observance of a specific notification.我想你有点困惑。只要通知或对象不同,就可以多次添加给定的观察者。只要通知或对象不同。
如果您为单个通知/对象组合多次添加观察者,您将收到多个通知 - 每次添加观察者时,您的通知方法都会被调用一次。这通常是不可取的,我认为这就是您所看到的建议。
您还只需为任何观察者调用一次
removeObserver:
,无论它正在观察多少事物。稍后,在适当的时候(对于视图控制器,
viewWillDisappear:
或viewDidUnload:
,具体取决于通知的性质;对于其他对象,dealloc
):I think you're a little confused. It's perfectly fine to add a given observer any number of times, as long as the notifications or objects are different.
If you add an observer multiple times for a single notification/object combo, you will receive multiple notifications -- your notification method will be called once for each time you added the observer. This is usually not desirable, and I think that's the recommendation that you've seen.
You also only need to call
removeObserver:
once for any observer, no matter how many things it's observing.Later, when appropriate (
viewWillDisappear:
, orviewDidUnload:
for view controllers, depending on the nature of the notifications;dealloc
for other objects):