我有一个带有按钮 Action 的 View Controller :

@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 的好地方吗?

或者有更合适的地方来做到这一点?

最佳答案

几个观察:

  • 我从您的代码注释中推断出您正在考虑删除该特定通知的选择器内的观察者。这是一个很好的做法。

    不过,我对仅调用 removeObserver 持谨慎态度,因为这将删除您可能已设置的所有观察者。如果您在作为特定通知的选择器的例程中调用它,那么我可能倾向于仅删除该特定通知:
    NSNotificationCenter.defaultCenter().removeObserver(self, name: NotificationConstants.pvpConnEstablishedString, object: nil)
    

    是的,在这一点上,您可能只观察到一个通知,所以这可能感觉没有必要,但是如果在将来的某个日期您为不同的通知添加完全独立的通知处理代码,您希望确保您不会意外处理特定通知时删除所有观察者。
  • 你可能想知道这个 View Controller 在通知到来之前可能被解除的可能性。在这种情况下,在 View Controller 的 removeObserver 方法中添加 deinit 可能是明智的。

    在这种情况下,简单的 removeObserver(self) 是谨慎的(因为在 View Controller 被释放时移除所有观察者是合理的)。
  • 关于ios - 何时为 nsnotificationcenter 调用 removeObserver,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32511277/

    10-10 21:14