NotificationCenter
当数据库中的数据更新时,我会向客户端发布带有新数据的通知。AViewController
将观察此通知,以便可以相应地更新 UI。
如果视图控制器观察到新通知并尝试更新 UI,而它不是屏幕上当前的视图控制器,应用程序会崩溃吗?
还是观察通知的功能会等到视图控制器出现才能执行?
3 回答
如果您的通知仅在您的视图控制器在屏幕上时才有意义,那么您应该收听viewWillAppear
并停止收听viewWillDisappear
.
另一种方法是在 viewDidLoad 中监听通知并在dealloc
(Objective-C) 或deinit
(Swift) 中停止监听。如果你这样做,你的视图控制器将在它活着的整个过程中收到指定的通知,无论它是否在屏幕上可见。
如果您在视图控制器不在最前面时继续收听通知,那么您不会崩溃,但您可能会进行不可见的更新,可能会使您的应用程序响应速度降低。
或者,您可以使用通知来更新视图控制器的模型(数据存储)并使代码足够智能以跟踪视图控制器何时可见,并且仅在可见时进行 UI更新。
编辑:
请注意,如果您在 viewDidLoad 中注册通知,并且您的应用在 iOS >= 9 中运行,则无需在deinit
/中取消注册通知dealloc
。操作系统现在会在对象被释放时处理取消注册通知的对象。
设置观察者的新“swifty”方法是使用完成块而不是选择器“addObserver(forName:object:queue:using:)”,因此当您必须观察通知时,您可以将观察标记保存到可选的 var、array 或 dictinary并取消(从集合中删除)后者以停止观察。在这种情况下,“观察者”将在解除分配时自动停止观察,并且不为同一通知多次订阅更安全。
通常你在 viewDidLoad/viewWillAppear 中添加 obeservers 并在 viewDidDisappear/deinit 中移除它们以避免诸如听键盘通知之类的 carshes
也尝试在 viewDidAppear 中刷新任何 viewController 的内容
注意:如果视图控制器在viewDidDisappear或deinit方法中删除观察之前观察并解除分配,则应用程序将崩溃
---- 无论有没有观察者,都不会发生等待