NS Notification Observer未被删除

时间:2018-02-20 05:08:33

标签: swift listener

我正在努力检测我的应用中的屏幕截图,这是问题..

override func viewDidAppear(_ animated: Bool) {

    let mainQueue = OperationQueue.main
        NotificationCenter.default.addObserver(forName: NSNotification.Name.UIApplicationUserDidTakeScreenshot,
                                           object: nil,
                                           queue: mainQueue) { notification in
                                           print("SCREENSHOT TAKEN")

        }

    }
override func viewDidDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self)
}

观察者工作正常,但它没有移除观察者,然后我可以得到大量的重复听众。我试图理解文档,但我不明白:/

谢谢!

2 个答案:

答案 0 :(得分:1)

请勿在{{1​​}}中添加观察者。在viewDidAppear中执行此操作。 viewDidLoad可能会被多次调用,这意味着您可能会多次注册viewDidAppear通知。

此外,您无需在iOS9 +中取消注册(UIApplicationUserDidTakeScreenshot)。如果您在小于9的iOS版本上运行,我建议您在removeObserver而不是deinit取消注册。

viewDidDisappear

答案 1 :(得分:1)

您可以将观察者存储在私有变量中,然后在方法中将其删除,如:

private var screenshotObserver: Any?

override func viewDidAppear(_ animated: Bool) {

    if screenshotObserver == nil {
        let mainQueue = OperationQueue.main
        screenshotObserver = NotificationCenter.default.addObserver(forName: NSNotification.Name.UIApplicationUserDidTakeScreenshot, object: nil, queue: mainQueue) { notification in
            print("SCREENSHOT TAKEN")
        }
    }
}

override func viewDidDisappear(_ animated: Bool) {

    if screenshotObserver != nil {
        NotificationCenter.default.removeObserver(screenshotObserver)
        screenshotObserver = nil
    }
}