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的方式调用
发送通知核心方法移除通知:
移除通知
网友评论