从ViewController观察通知

时间:2018-01-17 22:08:14

标签: ios uiviewcontroller notificationcenter ios-lifecycle

在数据库中更新数据时,我会通过新数据向客户发送通知NotificationCenterViewController将观察此通知,因此可以相应地更新UI。
如果视图控制器观察到新通知并尝试更新UI,应用程序是否会崩溃,而不是屏幕上的当前View Controller?
或者观察通知的功能会等到视图控制器出现执行吗?

3 个答案:

答案 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'将在解除分配时自动停止观察,并且更安全的是不会多次订阅相同的通知。