Swift-正确的调用.removeObserver的位置总是deinit()吗?

时间:2018-11-20 14:05:16

标签: ios swift nsnotificationcenter observers deinit

此处有新的StackOverflow用户(首次发布,长时间潜伏在没有帐户的情况下)。在我开始之前,这些是一些先前已回答的问题,我发现这是有帮助的,但尚未完全解决我的问题:

How to safely removeObserver (Swift)

The right place to call .removeObserver for NSNotificationCenter = Swift deinit()?

通过这些,我构建了一个BaseView控制器,通过它可以控制我的应用在各种情况下的行为(例如,当应用回到前台时,API调用以检查更新)

class BaseViewController : UIViewController {

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    NotificationCenter.default.addObserver(self, selector: #selector(applicationWillEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(applicationDidEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
}

@objc func applicationWillEnterForeground() {

}

@objc func applicationDidEnterBackground() {

}

deinit {
    print("WORKING - deinit BaseViewController")
    NotificationCenter.default.removeObserver(self, name: UIApplication.willEnterForegroundNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIApplication.didEnterBackgroundNotification, object: nil)
}

}

但是,我的问题是我需要使用其他NotificationCenter观察者来动态控制导航(进度)栏,该导航栏取决于用户在应用程序中的位置(以及他们在其中进行的操作,与其他区域隔离)

然后我的问题是:“调用.removeObserver的正确位置始终是deinit()吗?” ,或者,如果没有,应该考虑添加.removeObserver调用的关键位置吗?< / p>

如果有帮助,则该应用程序每个部分的导航栏都将附加到MainPagerVC(一个UIPageViewController)上,并可以通过LGSideMenuController重新使用和切入和切出

1 个答案:

答案 0 :(得分:1)

根据您的情况,您应该删除viewWillDisappear中的观察者

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self, name: UIApplication.willEnterForegroundNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIApplication.didEnterBackgroundNotification, object: nil)
}