NSNotificationCenter:在Swift中删除观察者

Jim*_*ery 9 nsnotificationcenter swift

我有一个带按钮的视图控制器.按下按钮时,会添加一个观察者,如下所示:

func buttonPress(sender:UIButton){
    NSNotificationCenter.defaultCenter().addObserverForName("buttonPressEvent", object:nil, queue:nil, usingBlock:{(notif) -> Void in
        // code
    })
}
Run Code Online (Sandbox Code Playgroud)

当我关闭此视图控制器,然后返回到它并按下按钮时,//code执行两次.如果我离开并再次回来,//code则执行三次,依此类推.

我想要做的是在我再次添加之前删除Observer,因此这段代码不会执行两次.我已经浏览了这里的文档,并在我添加Observer的地方添加了这行代码:

    NSNotificationCenter.defaultCenter().removeObserver(self, name:"buttonPressEvent", object:nil)
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

谁能告诉我哪里出错了?

Mik*_*ard 29

当您使用基于"块"的方法来观察通知时self,实际上并不是观察者.该函数返回一个充当观察者的对象:

func addObserverForName(_ name: String?,
                 object obj: AnyObject?,
                  queue queue: NSOperationQueue?,
             usingBlock block: (NSNotification!) -> Void) -> NSObjectProtocol
Run Code Online (Sandbox Code Playgroud)

您需要保留对此返回对象的引用,并在调用时将其作为观察者传入 removeObserver

它在苹果文档很好地解释这里