美文网首页
自定义NSNotification

自定义NSNotification

作者: 吕建雄 | 来源:发表于2019-07-14 20:11 被阅读0次

NSNotification在iOS开发中使用频率还是比较高的,大部分都停留在使用阶段;今天详细讲解下iOS中关于NSNotification的实现原理;

iOS通知中心的使用的是设计模式中的观察者模式,NSNotificationCenter是整个通知中心的调度核心;

下面将按照个人的理解以及Apple中的API自己实现了通知中心

通知类 通知中心类

通知类以及通知中心类,是按照Apple中的NSNotification以及NSNotificaitionCenter来定义;

LjxNotificationCenter类中:

+ (instancetype _Nonnull )defaultCenter;为单例

私有属性NSMutableDictionary *notificationDict 用来存储添加通知相关信息的字典;

此处说明下,为什么使用字典:

首先,信息的传递就依靠通知(LjxNotification),也就是说,通知就是信息(执行的方法,观察者本身(self),参数)的包装。通知中心(LjxNotificationCenter)是个单例,向通知中心注册观察者,也就是说,这个通知中心有个集合,这个集合存放着观察者。那么这个集合是什么样的数据类型 ? 可以这么思考: 发送通知需要name参数,添加观察者也有个name参数,这两个name一样的时候,当发送通知时候,观察者对象就能接受到信息,执行对应的操作。那么这个集合很容易想到就是NSDictionary!

 key就是name,value就是NSArray(存放数据模型),里面存放观察者对象

当发送通知时,在通知通知的字典,根据name找到value,这个value就是一数组,数组里面存放数据模型(observer、SEL)。即可执行对应的行为

添加通知的方法,不过就是将需要配置的变量保存起来,所以此处定义一个Model,用来保存通知需要用到的变量

保存配置的变量

添加通知核心代码:

添加通知时候需要考虑是否已经存在所添加名称的通知,如果存在直接根据name取出通知集合NSArray类,再将刚添加的model追加进去;如果不存在,直接创建通知集合NSArray类,将mode添加到集合类中

添加通知(1) 添加通知(2)

发送通知有三个方法,最终都是通过- (void)postNotification:(LjxNotification *)notification 来发送

注意:

发送通知时候需要考虑线程的情况,如果观察者指定了现场,那么就需要在指定线程中执行,否则直接调用

另外,观察则也有可能是通过block的方式调用

发送通知核心方法

移除通知:

移除通知

实现代码

相关文章

网友评论

      本文标题:自定义NSNotification

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