美文网首页
Notification、Delegate

Notification、Delegate

作者: 求长生 | 来源:发表于2020-05-31 14:10 被阅读0次

    一、Notification(通知)
    1、一对多的传递方式,使用观察者模式来实现的用于跨层传递信息的机制。
    NSNotification 是iOS中一个调度消息通知的类,采用单例模式设计,在程序中实现传值、回调。通知是松耦合的,也通过NSNotification来实现解耦的目的。
    2、通过NSNotificationCenter发送发送通知,其中NSNotification主要的字段有如下几个:
    name 通知的名称,用于通知的唯一标识
    object 保存发送通知的对象
    userinfo 保存给通知接受者传递的额外信息
    3、NSNotificationCenter提供了一套机制来发送通知,本质上来讲NSNotificationCenter其实就是一个通知派发表。
    在NSNotificationCenter内部一共保存了两张表。一张用于保存添加观察者的时候传入了NotifcationName的情况;一张用于保存添加观察者的时候没有传入了NotifcationName的情况,
    4、添加观察者的流程
    1.首先在初始化NSNotificationCenter会创建一个对象,这个对象里面保存了NamedTable、UNamedTable和一下其他信息。
    2.所有的添加通知操作最后都会调用到addObserver: selector: name: object:。
    3.首先会根据传入的参数,实例化一个Observation。这个Observation保存了观察者对象、接收到通知观察者对所执行的方法,由于Observation是一个链表,还保存了下一个Observation的地址。
    4.根据是否传入通知的Name选择在Named Table还是UNamed Table操作。
    5.如果传入通知的Name,则会先去用Name去查找是否已经有对应的Value(注意这个时候返回的Value是一个Table)
    6.如果没有对应的Value,则创建一个新的Table,然后将这个Table以Name为Key添加到Named Table。如果有Value,那么直接去取出这个Table。
    7.得到了保存Observation的Table之后,就通过传入的object去拿对应的链表。如果object为空,会默认有一个key表示传入object为空的情况,取的时候也会直接用这个key去取。表示所有任何地方发送通知都会监听。
    8.如果在保存Observation的Table中根据object作为key没有找到对应的链表,则会创建一个节点,作为头结点插入进去;如果找到了则直接在链表末尾插入之前实例化好的Observation。
    5、发送通知的流程
    调用postNotificationName:(NSNotificationName)aName object:(nullable id)anObject来实现。
    1.根据NotifcationName查找到对应的Observer链表
    2.然后遍历整个链表,给每个Observer结点中保持存的对象及SEL
    3.来向对象发送信息(也即是调用对象的SEL方法)

    {1.应用服务提供商从服务器端把要发送的消息和设备令牌(device token)发送给苹果的消息推送服务器 APNs。
    2.APNs根据设备令牌在已注册的设备(iPhone、iPad、iTouch、mac 等)查找对应的设备,将消息发送给相应的设备。
    3.客户端设备接将接收到的消息传递给相应的应用程序,应用程序根据用户设置弹出通知消息。}

    深入理解iOS NSNotification

    二、Delegate(委托代理)
    代理是一种概念,协议是一种技术,代理是用协议来实现的,代理 是 2 个对象之间通讯的一种方式。 代理主要做反向传值的。实现一些回调方法。
    代理是一种设计模式(委托-代理模式)。delegate只是保存了一个对象指针(一定要用week修饰delegate,不然也会循环引用)直接回调,运行成本低。

    delegate的使用

    block和代理本质上是不同的,因为block其实是一个对象,代理是一种设计模式(委托-代理模式)。
    block的代码可读性更好。
    block是一种轻量级的回调,可以直接访问上下文,由于block的代码是内联的,运行效率更高。
    block是一个对象,实现了匿名函数的功能。所以我们可以把block当做一个成员变量、属性、参数使用,使用起来非常灵活。

    blcok的运行成本高。block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是引用计数加1,使用完或者block置nil后才销毁。delegate只是保存了一个对象指针(一定要用week修饰delegate,不然也会循环引用),直接回调。
    block容易造成循环引用,而且不易察觉。

    相关文章

      网友评论

          本文标题:Notification、Delegate

          本文链接:https://www.haomeiwen.com/subject/vusrahtx.html