NSNotificationCenter: 在Swift中移除观察者

9

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

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

当我关闭这个视图控制器,然后返回并按下按钮时,//code 会执行两次。如果我再离开并回来,//code 就会执行三次,以此类推。
我想要做的是在再次添加观察者之前删除它,这样这段代码就不会执行两次。我已经阅读了这里的文档,并在添加观察者的代码上面添加了这行代码:
    NSNotificationCenter.defaultCenter().removeObserver(self, name:"buttonPressEvent", object:nil)

但是这个方法不起作用。

有人可以告诉我错在哪里吗?

2个回答

30

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

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

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

在苹果文档这里很好地解释了这一点。


-1

我是这样实现的,看起来运行良好。

override func viewDidLoad() 
{
        super.viewDidLoad()    
       AddScreenShotNotification() 
}

 func AddScreenShotNotification() {

NSNotificationCenter.defaultCenter().addObserver(
           self,
            selector: #selector(MyViewController.ScreenShotTaken),
            name: UIApplicationUserDidTakeScreenshotNotification,
            object: nil)
}

func ScreenShotTaken()
    {        
 // do something     
    }

 override func viewWillDisappear(animated: Bool) {
        NSNotificationCenter.defaultCenter().removeObserver(self)    
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接