我有一个带按钮动作的视图控制器:
@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)
是的,此时,您可能只是观察单个通知,因此这可能是不必要的,但如果在将来某个日期您为不同的通知添加完全单独的通知处理代码,您希望确保不会意外处理特定通知时删除所有观察者。removeObserver
方法中添加deinit
可能也是谨慎的。
在这种情况下,简单的removeObserver(self)
是谨慎的(因为在取消分配视图控制器时删除所有观察者是合理的)。如前所述,您希望对要删除的内容以及删除内容有所了解......但是,您可能希望将以下内容添加到正在观察此类通知的类中:
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
将self替换为您要特别删除的通知名称。当您的类未被实例化并准备好进行垃圾回收时,这将被删除。
Here你可以找到关于这个主题的整个讨论,也许你可以就这个问题形成你自己的意见。
您不再需要从ios9 +中删除obobserver。它会自动删除。