何时为 nsnotificationcenter 调用 removeObserver

when to call removeObserver for nsnotificationcenter

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

@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 是否合适?

或者有更合适的地方做这个吗?

一些观察:

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

    不过,我对仅调用 removeObserver 持谨慎态度,因为这会删除您可能已设置的所有观察者。如果您在作为特定通知的选择器的例程中调用它,那么我可能倾向于只删除该特定通知:

    NSNotificationCenter.defaultCenter().removeObserver(self, name: NotificationConstants.pvpConnEstablishedString, object: nil)
    

    是的,在这一点上,您可能只观察到一个通知,所以这可能感觉没有必要,但如果在将来某个时候您为不同的通知添加完全独立的通知处理代码,您需要确保您不会在处理特定通知时不小心删除所有观察者。

  2. 您可能需要注意在通知进入之前可能会关闭此视图控制器的可能性。在这种情况下,在deinit 视图控制器的方法。

    在这种情况下,简单的removeObserver(self)是谨慎的(因为在释放视图控制器时移除所有观察者是合理的)。

如前所述,您希望对要删除的内容以及删除它的时间保持敏感...但是您可能希望将以下内容添加到 class 中,该 class 正在观察此类通知以下:

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

将 self 替换为之前提到的要专门删除的通知的名称。这将在您的 class 未实例化并准备好进行垃圾收集时删除。

Here 您可能会找到关于此主题的完整讨论,也许您可​​以就此主题形成自己的意见。

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

enter link description here