繁体   English   中英

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

[英]Removing all notification observer from a single place

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

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

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

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

[[NSNotificationCenter defaultCenter] removeObserver:self];

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

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

在Swift的情况下,你这样做:

NSNotificationCenter.defaultCenter().removeObserver(self)

在Swift 3中:

NotificationCenter.default.removeObserver(self)

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

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

[编辑:对您的评论作出回应而B类从观察中停止A类]

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM