4

NotificationCenter当数据库中的数据更新时,我会向客户端发布带有新数据的通知。AViewController将观察此通知,以便可以相应地更新 UI。
如果视图控制器观察到新通知并尝试更新 UI,而它不是屏幕上当前的视图控制器,应用程序会崩溃吗?
还是观察通知的功能会等到视图控制器出现才能执行?

4

3 回答 3

6

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

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

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

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

编辑:

请注意,如果您在 viewDidLoad 中注册通知,并且您的应用在 iOS >= 9 中运行,则无需在deinit/中取消注册通知dealloc。操作系统现在会在对象被释放时处理取消注册通知的对象。

于 2018-01-17T22:51:22.977 回答
0

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

于 2018-01-17T22:54:18.610 回答
0

通常你在 viewDidLoad/viewWillAppear 中添加 obeservers 并在 viewDidDisappear/deinit 中移除它们以避免诸如听键盘通知之类的 carshes

也尝试在 viewDidAppear 中刷新任何 viewController 的内容

注意:如果视图控制器在viewDidDisappeardeinit方法中删除观察之前观察并解除分配,则应用程序将崩溃

---- 无论有没有观察者,都不会发生等待

于 2018-01-17T22:10:30.543 回答