【问题标题】:Observing notifications from ViewController观察来自 ViewController 的通知
【发布时间】:2018-01-17 22:08:13
【问题描述】:

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

【问题讨论】:

    标签: ios uiviewcontroller notificationcenter ios-lifecycle


    【解决方案1】:

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

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

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

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

    编辑:

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

    【讨论】:

    【解决方案2】:

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

    同时尝试刷新 viewDidAppear 中任何 viewController 的内容

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

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

    【讨论】:

    • 为什么不在 viewWillAppear 中添加观察者?如果我在 viewDidLoad 中添加观察者并在 viewDidDisappear 中删除,当视图再次出现时,观察者仍然会消失。
    • 是的,这是一个常见的错误
    • @NonProgrammer 通常取决于应用中的场景
    【解决方案3】:

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

    【讨论】:

    • 实际上,您将两种不同的东西混为一谈。正如你所说,有一个新方法addObserver(forName:object:queue:using:) 接受一个队列和一个闭包,并返回对结果对象的引用。我刚刚对其进行了测试,当创建它的对象被释放时,您仍然需要删除这样的观察者。添加观察者的基于选择器的方式addObserver(_:selector:name:object:),当您的对象被释放时,您不必在 iOS >= 9.0 中删除选择器。
    • 观察者依赖于返回的对象。销毁此令牌实际上是删除观察者。如果 token 被释放,则不会调用任何闭包。另一个好处 - 支持obj-c,声明obj-c选择器等没有限制。
    • "销毁此令牌实际上是删除观察者。"这是不正确的。您可以使用“addObserver(forName:object:queue:using:)”添加观察者并忽略返回的令牌,观察者仍然存在。该方法要求您显式调用 removeObserver() 或观察者无限期地持续存在(直到应用程序终止。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2018-01-17
    • 1970-01-01
    • 2014-01-07
    • 2016-10-11
    相关资源
    最近更新 更多