NSNotificationCenter:在Swift中删除观察者

时间:2014-12-02 17:01:12

标签: swift nsnotificationcenter

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

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

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

我想要做的是在我再次添加之前删除Observer,因此此代码不会执行两次。 Ive gone through the documentation here并且我在上面添加了Observer:

的地方添加了这行代码
    NSNotificationCenter.defaultCenter().removeObserver(self, name:"buttonPressEvent", object:nil)

但这不起作用。

谁能告诉我哪里出错?

2 个答案:

答案 0 :(得分:29)

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

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

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

Apple Doc here

中对此进行了详细解释

答案 1 :(得分:0)

像这样实现它,似乎工作正常。

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)    
    }