从一个地方删除所有通知观察者

时间:2011-04-11 17:16:11

标签: ios objective-c iphone cocoa-touch

我想删除通知观察者,我正在使用该方法:

[[NSNotificationCenter defaultCenter] removeObserver: name:@"myNotification" object:nil];

为此。现在有很多观察者正在听这个通知,我想从集中的地方一次性删除所有这些通知。我可以在第一个参数中传递'nil',它会删除所有正在侦听myNotification的观察者吗?

3 个答案:

答案 0 :(得分:82)

您可以一起从通知中心删除对象,这意味着不会触发任何通知。例如,当我有一个已注册通知的视图控制器时,我将此行包含在我的dealloc中。

[[NSNotificationCenter defaultCenter] removeObserver:self];

这是在对象级别...因此它将取消注册许多通知。它不会取消注册许多对象中的一个通知。

希望我能正确理解你的问题。

答案 1 :(得分:7)

对于Swift,你这样做:

NSNotificationCenter.defaultCenter().removeObserver(self)

在Swift 3中:

NotificationCenter.default.removeObserver(self)

答案 2 :(得分:1)

不幸的是,没有办法在一个地方删除特定通知的所有观察者。虽然有一些情况会很好,但通常情况下这样做是危险的,执行观察的对象应该负责添加和删除自己作为特定通知的观察者。这确保了b / c观察者不会出现不可预测的行为,因此他们可以自行配置和清理。

如果生成通知的对象消失,则观察者无关紧要,因为观察者无论如何都不知道该对象。它只是意味着对象不会再生成通知。

[编辑:对你的评论作出回应,而B级则从观察中停止进行评级]

我刚看到你的评论。有不同的方法可以实现这一点,特别是如果B类知道A类。当您引用类时,听起来您想要影响类的所有实例与特定实例。如果您有某些条件,您可以在处理通知时进行检查,这就是我如何处理此问题。在通知处理程序中,例如:

if ([self shouldRespondToNotificationNamed:notification.name]) {
   [self performNotificationAction];
}

如果您没有可以检查的条件,则可以在相关类中创建一个作为iVar的条件,或者在可以全局访问所有类实例的位置创建一个条件。我通常使用单例来存储不会持久的全局应用程序状态。如果它仍然存在,那么使用你用于其他状态的任何方法。