NSNotificationQueue

NSNotificationQueue是操作队列

  1. NSNotificationQueue是notification Center的缓冲池。
    如果我们使用普通的- (void)postNotification:(NSNotification *)notification这种方法来发送通知,那么这个通知就会直接发送到notification Center,notification Center则会直接将其发送给注册了该通知的观察者。但是如果我们使用NSNotificationQueue就不一样了,通知不是直接发送给notification Center,而是先发送给NSNotificationQueue,然后由NSNotificationQueue决定在当前runloop结束或者空闲的时候转发给notification Center,再由notification转发给注册的观察者。通过NSNotificationQueue,可以合并重复的通知,以便只发送一个通知。
  2. NSNotificationQueue遵循FIFO的顺序,当一个通知移动到NSNotificationQueue的最前面,它就被发送给notification Center,然后notification Center再将通知转发给注册了该通知的监听者。
  3. 每一个线程都有一个默认的NSNotificationQueue,这个NSNotificationQueue和通知中心联系在一起。当然我们也可以自己创建NSNotificationQueue,可以为一个线程创建多个NSNotificationQueue。
- (void)enqueueNotification:(NSNotification *)notification postingStyle:(NSPostingStyle)postingStyle coalesceMask:(NSNotificationCoalescing)coalesceMask forModes:(nullable NSArray *)modes;

上面这个方法是使用NSNotificationQueue来发送通知用的。这里面有四个参数。

  • notification是所要发送的通知。
  • postingStyle 这是一个枚举类型的参数。
typedef NS_ENUM(NSUInteger, NSPostingStyle) {
    NSPostWhenIdle = 1,
    NSPostASAP = 2,
    NSPostNow = 3
};

NSPostingStyle即指发送通知的方式,一共有三种方式。

  1. NSPostWhenIdle
    通过字面意思大概可以知道是在空闲时发送。
    简单地说就是当本线程的runloop空闲时即发送通知到通知中心。
  2. NSPostASAP
    ASAP即as soon as possible,就是说尽可能快。
    当当前通知或者timer的回调执行完毕时发送通知到通知中心。
  3. NSPostNow
    多个相同的通知合并之后马上发送。
  • coalesceMask
    coalesceMask即多个通知的合并方式。它也是一个枚举类型。
    有时候会在一段时间内向NSNotificationQueue发送多个通知,有些通知是重复的,我们并不希望这些通知全部发送带通知中心,那么就可以使用这个枚举类型的参数。
typedef NS_OPTIONS(NSUInteger, NSNotificationCoalescing) {
    NSNotificationNoCoalescing = 0,
    NSNotificationCoalescingOnName = 1,
    NSNotificationCoalescingOnSender = 2
};
  1. NSNotificationNoCoalescing
    不管是否重复,不合并。
  2. NSNotificationCoalescingOnName
    按照通知的名字,如果名字重复,则移除重复的。
  3. NSNotificationCoalescingOnSender
    按照发送方,如果多个通知的发送方是一样的,则只保留一个。
  • modes
    这里的mode指定的是当前的runloop的mode,指定mode后,只有当前线程的runloop在这个特定的mode下才能将通知发送到通知中心。

同步与异步发送

  • 同步发送通知
    当我们使用下列这些方法时是使用的同步发送通知,这些也是我们平时常用的发送通知的方法。
- (void)postNotification:(NSNotification *)notification;
- (void)postNotificationName:(NSString *)aName object:(nullable id)anObject;
- (void)postNotificationName:(NSString *)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;

同步指的是,当发送方发送通知后,必须要等到所有的监听者完成监听回调,发送方才会接着执行下面的代码。所以如果监听者的回调有大量的计算要处理的话,发送方会一直等待,只有回调全部结束才接着往下执行。

  • 异步发送通知
    当我们使用NSNotificationQueue(通知队列)的下列方法发送通知时是异步发送通知:
- (void)enqueueNotification:(NSNotification *)notification postingStyle:(NSPostingStyle)postingStyle;
- (void)enqueueNotification:(NSNotification *)notification postingStyle:(NSPostingStyle)postingStyle coalesceMask:(NSNotificationCoalescing)coalesceMask forModes:(nullable NSArray *)modes;

异步发送通知即只要发送方的通知发送出去了,不管监听方的回调是否执行完毕,反正我就开始执行下面的代码。
但是!!!需要注意的是,当NSPostingStyle的类型是NSPostWhenIdle和NSPostASAP时确实是异步的,而当类型是NSPostNow时则是同步的。

你可能感兴趣的:(NSNotificationQueue)