NSNotification是OC中一个调度消息通知的类, 采用单例模式设计, 在程序中实现传值,回调等应用广泛.
OC中, NSNtification是使用观察者模式来实现跨层传递消息, 可实现解耦的目的.
NSNotificationCenter 通知中心
1. 作用: NSNotificationCenter是用来管理通知的接受和发送的. 一个对象发送通知给通知中心, 然后通知中心会将这个通知发送给观察者.
2. 使用: 一个进程(一般即指一个APP)都会有一个默认的通知中心[NSNotificationCenter defaultCenter];可获取.
NSNotificationQueue 通知队列
通知队列, 用来管理多个通知的调用(FIFO先进先出). NSNotificationQueue就行一个缓冲池, 通过特定的方式通过NSNotificationCenter发送到响应的观察者
1. 创建通知队列方法
- (instancetype)initWithNotificationCenter:(NSNotificationCenter *)notificationCenter NS_DESIGNATED_INITIALIZER;
2. 往队列加入通知(发送通知)方法
- (void)enqueueNotification:(NSNotification *)notification postingStyle:(NSPostingStyle)postingStyle;
- (void)enqueueNotification:(NSNotification *)notification postingStyle:(NSPostingStyle)postingStyle coalesceMask:(NSNotificationCoalescing)coalesceMask forModes:(nullable NSArray *)modes;
3. 移除队列中的通知方法
- (void)dequeueNotificationsMatching:(NSNotification *)notification coalesceMask:(NSUInteger)coalesceMask;
4. 发送方式
NSPostingStyle包括三种类型:
typedef NS_ENUM(NSUInteger, NSPostingStyle) { NSPostWhenIdle = 1, NSPostASAP = 2, NSPostNow = 3 };
NSPostWhenIdle:空闲发送通知,当RunLoop处于等待或空闲状态时,发送通知,对于不重要的通知可以使用。
NSPostASAP:尽快发送通知,当前RunLoop迭代完成时,通知将会被发送,有点类似没有延迟的定时器。
NSPostNow:同步发送通知,如果不使用合并通知和postNotification:一样是同步通知。
合并通知:NSNotificationCoalescing
NSNotificationCoalescing也包括三种类型:
typedef NS_OPTIONS(NSUInteger, NSNotificationCoalescing) {
NSNotificationNoCoalescing = 0,//不合并通知
NSNotificationCoalescingOnName = 1,//合并相同名称的通知(NSNotification的name相同)
NSNotificationCoalescingOnSender = 2//合并同一对象的通知(NSNotificationobject相同)
};
通过合并我们可以用来保证相同的通知只被发送一次。
注意事项:
1. 通知的定义最好都放在一个头文件中, 尽量规范命名, 便于取分通知目的
2. 接收通知的线程和发送通知的线程一致, 一般为主线程, 这与KVO观察者注册的线程不同
3. 通知观察者对象接收到并处理完消息后才会执行下去, 如果想异步发布通知, 使用NotificationQueue;