【问题标题】:How NSNotification worksNSNotification 是如何工作的
【发布时间】:2013-06-30 07:50:52
【问题描述】:

我了解通知、海报和观察者中的内容。

但我完全无法理解我们的应用或操作系统如何理解并将标志/通知发送给观察者类?

这背后的机制是什么?

您的回答和帮助将不胜感激。

谢谢

身份证。

【问题讨论】:

    标签: ios objective-c nsnotificationcenter nsnotifications


    【解决方案1】:

    将通知中心想象成一个字典,其中包含通知名称的键和观察者列表的值(及其指定的操作方法)。发布通知时,将获取并迭代该通知名称的观察者列表。每个观察者都有自己的 action 方法调用通知信息。

    此外,在迭代过程中,会检查通知对象是否对观察者感兴趣(基于添加观察者时提供的参数)。

    通知过程在发布通知的线程上执行。

    不要考虑尝试依赖与添加观察者的方式和时间相关的任何隐含顺序。

    【讨论】:

    • 那么,如果我发布一个有“n”个观察者的通知,是否会导致内部循环迭代“n”次?
    【解决方案2】:

    基本上,NotificationCenter 保留对任何注册为观察者的对象的引用。通过该引用,它还可以跟踪对象想要什么样的通知。 当一个对象发布通知时,中心通过向观察者发送带有该选择器的消息,将其传递给每个注册的观察者。

    默认中心通常是一个全局单例。但是您可以创建自己的,也许如果您想确保您的通知对您的应用程序是私有的。

    【讨论】:

    • 我们如何创建自己的通知?
    • 通过子类化或不使用类工厂方法。
    【解决方案3】:

    为了发送通知,对象发送:

    [[NSNotificationCenter defaultCenter] postNotificationName:@"notif_key" object:nil userInfo:userDict];
    

    现在,每个监听名为 @"notif_key" 的通知的活对象都可以执行一些操作。

    你如何让一个对象来听?

    它需要运行:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:@"notif_key" object:nil];
    

    当第一个对象发送通知时,观察者对象将运行 'doSomething:' 方法。

    注意事项:

    • userDict 是一个字典,您可以在其中向这些观察者发送一些信息。
    • 不要忘记在 dealloc 方法中取消观察者。

    【讨论】:

      【解决方案4】:

      把它添加到你的理解中,我花了一些时间消化到我的脑海中。虽然它没有说明它在内部是如何工作的,但它说明了它是如何实现的

      在多线程应用程序中,通知总是在发布通知的线程中传递,可能与观察者注册自己的线程不同。

      来源:apple documentation

      所以通知可以在任何线程中注册,但是与通知关联的方法在发布通知的线程上运行,所以如果我们想对 UI 进行任何更改,我们将其调度到主线程.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        • 2016-11-13
        相关资源
        最近更新 更多