5. 通知

作者: 如果大雨落下 | 来源:发表于2020-06-24 19:05 被阅读0次
图片.png
  • 通知基础

NSNotificationCenter 是iOS中一个调度消息通知的类,采用单例模式设计,在程序中实现传值、回调等地方应用很广。在iOS中,NSNotification是使用观察者模式来实现的用于跨层传递消息。往往也用NSNotification来实现解耦的目的。

它的实质是程序内部提供的一种广播机制。把接受到的消息根据内部消息转发出去,将消息转发给需要的对象。

通知这种传值方式一般用于一对多的情况,iOS中常见的还有代理传值、block传值等。代理实现和block一般用于一对一的情况。

  • 接收通知的线程,和发送通知所处的线程是同一个线程。也就是说如果如果要在接收通知的时候更新UI,需要注意发送通知的线程是否为主线程。

通知中的数据结构

NSNotification:

字段名 含义
name 通知的名称,用于通知的唯一标识
object 保存发送通知的对象
userinfo 保存给通知接受者传递的额外信息

NSNotification是一个类簇(nsnumber就是个类簇,对各种数据包装,具体的实现都隐藏起来,没有init,具体有包的实现),不能通过init实例化,比如NSNotification *notif = [[NSNotification alloc]init];这样会引起下面的异常。


图片.png

但是可以通过装饰构造方法创建实例对象,装饰构造方法如下。
:- initWithName:(NSNotificationName)name object:(nullable id)object userInfo:(nullable NSDictionary *)userInfo;

  • 如果想要附加更多信息在NSNotification中,可以子类化NSNotification,额外新加的字段。需要注意的一点就是虽然可以自己去实现装饰构造方法,但是切记在自定义的装饰构造方法中不要调用[super init]。
NSNotificationCenter

NSNotificationCenter提供了一套机制来发送通知,本质上来NSNotificationCenter其实就是一个通知派发表。

addObserver:selector:name:object:
参数object表示的是观察者只会接受来至object对象发出的所注册的通知。而不会接受其他对象发送的所注册的通知。

方法addObserverForName:object:queue:usingBlock:。因为平时这个用得不是特别多。相比addObserver:selector:name:object:这种方式添加通知,多了个queue和block。这里的queue就是决定将block提交到哪个队列里面执行(不是注册方法,相当于是接受通知后的操作直接写到block里面了)。通知接收和发送的线程是同一个。常见的会把这个queue设置为主队列,因为主队列的任务都会在主线程下完成,所以可以用这种方式来实现通知更新UI。而不使用注册SEL的方式。

NSNotificationQueue
  • NSNotificationQueue在NSNotificationCenter起到了一个缓冲的作用。尽管NSNotificationCenter已经分发通知,但放入队列的通知可能会延迟,直到当前的runloop结束或runloop处于空闲状态才发送。具体策略是由后面的参数决定。

  • 如果有多个相同的通知,可以在NSNotificationQueue进行合并,这样只会发送一个通知。NSNotificationQueue会通过先进先出的方式来维护NSNotification的实例,当通知实例位于队列首部,通知队列会将它发送到通知中心,然后依次的像注册的所有观察者派发通知。

  • 每个线程有一个默认和 default notification center相关联的的通知队列。


    图片.png

通过调用initWithNotificationCenter和外部的NSNotificationCenter关联起来,最终也是通过NSNotificationCenter来管理通知的发送、注册。除此之外这里有两个枚举值需要特别注意一下。

NSPostingStyle:用于配置通知什么时候发送
    NSPostASAP:在当前通知调用或者计时器结束发出通知
    NSPostWhenIdle:当runloop处于空闲时发出通知
    NSPostNow:在合并通知完成之后立即发出通知。
NSNotificationCoalescing(注意这是一个NS_OPTIONS):用于配置如何合并通知
    NSNotificationNoCoalescing:不合并通知
    NSNotificationNoCoalescing:按照通知名字合并通知
    NSNotificationCoalescingOnSender:按照传入的object合并通知
图片.png

参考:https://www.jianshu.com/p/83770200d476

相关文章

  • 5. 通知

    通知基础 NSNotificationCenter 是iOS中一个调度消息通知的类,采用单例模式设计,在程序中实现...

  • UNUserNotificationCenter的基本使用

    引入头文件 注册通知 检查通知权限 发送本地通知 5.发送本地通知一定要实现以下代理方法 通知代理方法

  • 5.如何通知客户到货

    5.如何通知客户到货 【我的-送货清单】点击【到货通知】,可以通知购买的人到货,会通过小程序通知,推送给购买的团员...

  • Android8.0新特性【转】

    1.通知渠道2.通知角标3.通知圆点4.通知延后5.消息样式6.通知超时7.后台执行限制8.画中画模式9.自适应图...

  • 5.事件通知(异步调用)

    在消费端配置: onreturn:方法正常返回,则回调callback对象的对应方法 onthrow : 方法异常...

  • 学佛与戒网2

    第二篇 筛选信息篇 5.关闭通知栏,关闭所有应用的悬浮通知和锁屏通知。不整天在社交媒体上闲聊,现实生活中都要少说话...

  • 物管后台测试进度

    1.首页 2.通知公告 3.门禁管理 4.员工管理 5.小区管理

  • ReactiveCocoa 常见使用

    1.代替 tapGesture 2.代替addTarget事件 3 .代替观察者KVO 4.监听 通知 5.代替代理

  • RAC开发中常见用法

    1.代理 ,具体见Jianshu 2.代替KVO 3.监听事件 4.代替通知 5.监听文本框

  • RAC的常见应用场景

    这里写RAC常见的应用场景 RAC集合 代替KVO 监听事件 代替通知 监听文本框5.代理 RAC集合 RACTu...

网友评论

      本文标题:5. 通知

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