在iOS9
中调整了NSNotificatinonCenter
iOS9
开始不需要在观察者对象释放之前从通知中心移除观察者了。但是如果使用-[NSNotificationCenter addObserverForName:object:queue:usingBlock:]
方法还是需要手动释放。因为NSNotificationCenter
依旧对它们强引用。# NSNotificationQueueNSNotificationQueue
通知队列,用来管理多个通知的调用。通知队列通常以先进先出(FIFO)顺序维护通。NSNotificationQueue
就像一个缓冲池把一个个通知放进池子中,使用特定方式通过NSNotificationCenter
发送到相应的观察者。下面我们会提到特定的方式即合并通知和异步通知。
创建通知队列方法:- (instancetype)initWithNotificationCenter:(NSNotificationCenter *)notificationCenter NS_DESIGNATED_INITIALIZER;
往队列加入通知方法:- (void)enqueueNotification:(NSNotification *)notification postingStyle:(NSPostingStyle)postingStyle;- (void)enqueueNotification:(NSNotification *)notification postingStyle:(NSPostingStyle)postingStyle coalesceMask:(NSNotificationCoalescing)coalesceMask forModes:(nullable NSArray<NSRunLoopMode> *)modes;
移除队列中的通知方法:- (void)dequeueNotificationsMatching:(NSNotification *)notification coalesceMask:(NSUInteger)coalesceMask;
发送方式NSPostingStyle
包括三种类型:typedef NS_ENUM(NSUInteger, NSPostingStyle) {NSPostWhenIdle = 1,NSPostASAP = 2,NSPostNow = 3};
NSPostWhenIdle:空闲发送通知 当运行循环处于等待或空闲状态时,发送通知,对于不重要的通知可以使用。NSPostASAP:尽快发送通知 当前运行循环迭代完成时,通知将会被发送,有点类似没有延迟的定时器。NSPostNow :同步发送通知 如果不使用合并通知 和postNotification:
一样是同步通知。
合并通知NSNotificationCoalescing
也包括三种类型:typedef NS_OPTIONS(NSUInteger, NSNotificationCoalescing) {NSNotificationNoCoalescing = 0,NSNotificationCoalescingOnName = 1,NSNotificationCoalescingOnSender = 2};
NSNotificationNoCoalescing:不合并通知。NSNotificationCoalescingOnName:合并相同名称的通知。NSNotificationCoalescingOnSender:合并相同通知和同一对象的通知。
通过合并我们可以用来保证相同的通知只被发送一次。forModes:(nullable NSArray<NSRunLoopMode> *)modes
可以使用不同的NSRunLoopMode
配合来发送通知,可以看出实际上NSNotificationQueue
与RunLoop
的机制以及运行循环有关系,通过NSNotificationQueue
队列来发送的通知和关联的RunLoop
运行机制来进行的。