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