我想删除通知观察者,我正在使用该方法:
[[NSNotificationCenter defaultCenter] removeObserver: name:@"myNotification" object:nil];
为此。现在有很多观察者正在听这个通知,我想从集中的地方一次性删除所有这些通知。我可以在第一个参数中传递'nil',它会删除所有正在侦听myNotification的观察者吗?
答案 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的条件,或者在可以全局访问所有类实例的位置创建一个条件。我通常使用单例来存储不会持久的全局应用程序状态。如果它仍然存在,那么使用你用于其他状态的任何方法。