【问题标题】:Is there a way to check if observer listens to some NSNotification?有没有办法检查观察者是否监听了一些 NSNotification?
【发布时间】:2013-10-17 20:11:10
【问题描述】:

我想检查我的视图是否正在监听 UIApplicationWillResignActiveNotification。如果它正在监听,那么我想在 dealloc 期间将其删除。现在我想知道是否有办法使用objective c来做到这一点?

我并不想避免多次添加通知。这是我想要做的更多解释。

我有自定义的 gridView。我可以在启用缩放或禁用缩放的情况下对其进行初始化。如果启用了缩放的初始化,我将自己添加为 UIApplicationWillResignActiveNotification 的观察者,但如果它的初始化禁用了缩放,那么它不会将自己添加为该通知的观察者。现在,在 dealloc 中,我想删除该 gridView 作为该通知的观察者。所以我想知道是否有办法找出 gridView 是否正在收听该通知。

【问题讨论】:

  • 您能具体说明您要完成的任务吗?
  • 没有办法检查观察者是否已经注册。
  • 总是将您的视图注册为观察者会不会更容易,然后在通知操作中包含您是否正在缩放的​​逻辑?这样你就会知道你总是需要在 dealloc 中取消注册

标签: ios objective-c nsnotificationcenter nsnotifications nsnotification


【解决方案1】:

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

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

将导致 self 停止监听该通知,或者如果 self 没有监听它,则什么也不做。

指定您要停止侦听的通知的名称是最佳做法,但既然您说您将其放在 dealloc 中,那么这样做也是安全的:

[[NSNotificationCenter defaultCenter] removeObserver:someObserver];

【讨论】:

    【解决方案2】:

    如果你想检查 dealloc 方法,如果你的视图被注册为观察者以正确删除它 - 你不应该。您需要做的就是:

    [[NSNotificationCenter defaultCenter] removeObserver:myView]
    

    它会删除你订阅的所有通知的观察者

    【讨论】:

    • 仅仅做 [[NSNotificationCenter defaultCenter] removeObserver:myView] 并不是好的编程习惯。
    【解决方案3】:

    NSNotificationCenter 不支持此开箱即用。您对 KVO 也有同样的问题。

    一般来说,一个对象是否已使用布尔属性注册并仅在设置了该布尔属性时才取消注册。

    【讨论】:

    • NSNotificationCenter 更宽容一点,因为您始终可以删除观察者,如果该对象目前不是观察者,它根本不会做任何事情。因此,您始终可以使用NSNotificationCenter 安全地致电removeObserver:。但是,如果您尝试删除 KVO 观察者但目标未观察,则会出现异常。这意味着,您确实需要使用 KVO 跟踪您的观察状态,但不一定使用 NSNotificationCenter
    • @DarkDust 仅仅因为你没有并不意味着你不应该不这样做。
    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2014-12-22
    • 1970-01-01
    相关资源
    最近更新 更多