何时为nsnotificationcenter调用removeObserver

问题描述 投票:3回答:3

我有一个带按钮动作的视图控制器:

@IBAction func MultiplayerButtonClick(sender: AnyObject) {
            NSNotificationCenter.defaultCenter().addObserver(
              self, 
              selector: NotificationConstants.pvpConnEstablishedSelector, 
              name: NotificationConstants.pvpConnEstablishedString , 
              object: nil)

            setUpGameScene()
            initiateMultiplayerGC()
    }

在某个地方,会发布一个通知,触发此观察者的选择器:

//action for pvpConnEstablishedSelector
func hideMainView() {
   MenuView.hidden = true
   //NSNotificationCenter.defaultCenter().removeObserver(self) ???
}

它是在观察者的选择器函数中调用removeObserver的好地方吗?

或者有更合适的地方吗?

ios swift nsnotificationcenter nsnotifications nsnotification
3个回答
2
投票

几点意见:

  1. 我从您的代码注释中推断出您正在考虑删除选择器中针对该特定通知的观察者。这是一个很好的做法。 不过,我会对调用removeObserver持谨慎态度,因为这会删除你可能设置的所有观察者。如果你在作为特定通知的选择器的例程中调用它,那么我可能倾向于仅删除该特定通知: NSNotificationCenter.defaultCenter().removeObserver(self, name: NotificationConstants.pvpConnEstablishedString, object: nil) 是的,此时,您可能只是观察单个通知,因此这可能是不必要的,但如果在将来某个日期您为不同的通知添加完全单独的通知处理代码,您希望确保不会意外处理特定通知时删除所有观察者。
  2. 您可能希望对通知进入之前可能解除此视图控制器的可能性敏感。在这种情况下,在视图控制器的removeObserver方法中添加deinit可能也是谨慎的。 在这种情况下,简单的removeObserver(self)是谨慎的(因为在取消分配视图控制器时删除所有观察者是合理的)。

2
投票

如前所述,您希望对要删除的内容以及删除内容有所了解......但是,您可能希望将以下内容添加到正在观察此类通知的类中:

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

将self替换为您要特别删除的通知名称。当您的类未被实例化并准备好进行垃圾回收时,这将被删除。

Here你可以找到关于这个主题的整个讨论,也许你可以就这个问题形成你自己的意见。


0
投票

您不再需要从ios9 +中删除obobserver。它会自动删除。

enter link description here

© www.soinside.com 2019 - 2024. All rights reserved.