正在观察来自 ViewController 的通知

Observing notifications from ViewController

当数据库中的数据更新时,我 post 客户端向 NotificationCenter 发送了一条包含新数据的通知。 ViewController 将观察此通知,因此 UI 可以相应地更新。
如果视图控制器观察到新通知并尝试更新 UI,而它不是当前屏幕上的视图控制器,应用程序是否会崩溃?
或者观察通知的函数是否会等到视图控制器出现时才执行?

通常你在 viewDidLoad/viewWillAppear 中添加观察者并在 viewDidDisappear / deinit 中移除它们以避免诸如监听键盘通知之类的错误

同时尝试刷新 viewDidAppear

中任何 viewController 的内容

注意: 如果视图控制器在 viewDidDisappeardeinit 方法

----无论是否有观察者都不会等待

如果您的通知仅在您的视图控制器在屏幕上时才有意义,那么您应该在 viewWillAppear 中收听并在 viewWillDisappear 中停止收听。

另一种方法是在 viewDidLoad 中监听通知并在 dealloc (Objective-C) 或 deinit (Swift) 中停止监听。如果你这样做,你的视图控制器将在它存在的整个过程中收到指定的通知,无论它是否在屏幕上可见。

如果您在视图控制器不在最前面时继续收听通知,那么您不会崩溃,但您可能会进行不可见的更新,这可能会降低您的应用程序的响应速度。

或者,您可以使用通知来更新视图控制器的模型(数据存储)并使代码足够智能以跟踪视图控制器何时可见,并且仅在 UI 时更新 可见。

编辑:

请注意,如果您在 viewDidLoad 中注册了通知,并且您的应用在 iOS >= 9 中运行,则无需在 deinit/ [=12 中注销通知=]. OS 现在处理取消分配对象时的通知注销。

设置观察者的“快速”新方法是使用完成块而不是选择器“addObserver(forName:object:queue:using:)”,因此您可以将观察标记保存到可选的 var、数组或字典中,当您必须观察通知并取消(从集合中删除)后者以停止观察。在这种情况下,'obsrever' 将在解除分配时自动停止观察,并且不要多次订阅同一通知更安全。