Swift - 调用 .removeObserver 的正确位置总是 deinit() 吗?
Swift - Is the correct place to call .removeObserver always deinit()?
这里是 Whosebug 新用户(第一次发帖,长期潜伏 w/o 一个帐户)。在我开始之前,这些是我发现有帮助但没有完全解决我的问题的一些以前回答的问题:
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 观察器来动态控制导航(进度)栏,这取决于用户在应用程序中的位置(以及他们在那里做什么,与其他人隔离)地区)。
我的问题是:"Is the correct place to call .removeObserver always deinit()?" 或者,如果没有,是否有任何关键地方应该考虑添加 .removeObserver 调用?
如果有帮助,应用程序每个部分的导航栏都附加到 MainPagerVC
(UIPageViewController
),可通过 LGSideMenuController 重复使用和切换进出
在你的情况下,你应该删除 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)
}
这里是 Whosebug 新用户(第一次发帖,长期潜伏 w/o 一个帐户)。在我开始之前,这些是我发现有帮助但没有完全解决我的问题的一些以前回答的问题:
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 观察器来动态控制导航(进度)栏,这取决于用户在应用程序中的位置(以及他们在那里做什么,与其他人隔离)地区)。
我的问题是:"Is the correct place to call .removeObserver always deinit()?" 或者,如果没有,是否有任何关键地方应该考虑添加 .removeObserver 调用?
如果有帮助,应用程序每个部分的导航栏都附加到 MainPagerVC
(UIPageViewController
),可通过 LGSideMenuController 重复使用和切换进出
在你的情况下,你应该删除 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)
}