有没有一种方法可以检查观察者是否监听了某个 NSNotification?

5

我想检查我的视图是否正在监听UIApplicationWillResignActiveNotification。如果正在监听,那么我希望在dealloc期间将其移除。现在,我想知道是否有使用Objective C实现这一点的方法?

我不想避免多次添加通知。这里是我尝试做的更多解释。

我有一个自定义的网格视图。我可以使用启用缩放或禁用缩放来初始化它。如果使用启用缩放初始化,则将其添加为UIApplicationWillResignActiveNotification的观察者,但如果使用禁用缩放来初始化,则不会将其添加为该通知的观察者。现在,在dealloc中,我想将该网格视图作为该通知的观察者删除。因此,我想知道是否有办法找出网格视图是否正在监听该通知。


请问您能具体说明您想要完成的任务吗? - ivanmoskalev
2
可能是重复的问题:如何避免添加多个NSNotification观察者? - iwasrobbed
没有办法检查观察者是否已经注册。 - iwasrobbed
难道总是将您的视图注册为观察者,然后在通知操作中具有缩放与否的逻辑不是更容易吗?这样,您就知道您始终需要在dealloc中取消注册。 - iain
3个回答

3

我不知道有什么方法可以检查你的观察者正在监听哪些通知,但无论它是否正在监听UIApplicationWillResignActiveNotification,调用以下代码:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification];

如果self正在监听该通知,指定要停止监听的通知名称是最佳实践;但是,由于您说将其放在dealloc中,所以只需执行以下操作也是安全的:

将会使self停止监听该通知,如果self没有在监听该通知,则不会有任何影响。

[[NSNotificationCenter defaultCenter] removeObserver:someObserver];

1
如果您想在dealloc方法中检查您的视图是否已注册为观察者以正确删除它 - 您不应该这样做。您所需要做的就是:
[[NSNotificationCenter defaultCenter] removeObserver:myView]

它将删除您订阅的所有通知的观察者


1
仅仅执行[[NSNotificationCenter defaultCenter] removeObserver:myView]并不是良好的编程实践。 - slonkar

0

NSNotificationCenter 不支持此功能。使用 KVO 时也会遇到相同的问题。

通常情况下,只需使用布尔属性跟踪对象是否已注册,并仅在设置了此布尔值时取消注册。


1
NSNotificationCenter在这方面更加宽容,因为您总是可以删除观察者,如果该对象此时不是观察者,则它不执行任何操作。因此,您始终可以安全地使用NSNotificationCenter调用removeObserver:方法。但是,如果尝试删除KVO观察者但目标没有进行观察,则会引发异常。这意味着您需要使用KVO跟踪观察状态,但不一定需要使用NSNotificationCenter。 - DarkDust
@DarkDust 只因为你不是必须这样做,并不意味着你不应该这样做。 - Christian Schnorr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接