Первый абзац документации NotificationQueue
дает вам подсказку -
В то время как центр уведомлений распределяет уведомления при их публикации, уведомления, помещенные в очередь, могут быть отложены доконец текущего прохода через цикл выполнения или до тех пор, пока цикл выполнения не будет свободен. Дублирующиеся уведомления могут быть объединены, так что отправляется только одно уведомление, хотя отправляется несколько уведомлений.
A NotificationQueue
не может объединять уведомления бесконечно, это можно сделать только до конца текущего прогонаПередача цикла или до тех пор, пока цикл выполнения не будет свободен.
Указание .now
для стиля проводки гласит:
Уведомление публикуется сразу после объединения.
Поскольку вы доставляете уведомление немедленно, оно не может объединиться с любыми уведомлениями, которые еще не были помещены в очередь, но оно может объединить любые уведомления, которые все еще находятся в очереди;Уведомления, поставленные в очередь с .whenIdle
или .asap
стилем отправки.
Рассмотрим следующий фрагмент:
NotificationCenter.default.addObserver(forName: .test, object: nil, queue: nil) { (notification) in
print("Received notification")
}
let queue = NotificationQueue.default
queue.enqueue(Notification(name: .test), postingStyle: .now)
print("Posted")
queue.enqueue(Notification(name: .test), postingStyle: .now)
print("Posted")
queue.enqueue(Notification(name: .test), postingStyle: .now)
print("Posted")
При этом будет напечатано:
Полученное уведомление
Опубликовано
Получено уведомление
Опубликовано
Получено уведомление
Опубликовано
Начиная с postingStyle
из.now
не допускает никакого coaelscing.
Теперь рассмотрим:
let queue = NotificationQueue.default
queue.enqueue(Notification(name: .test), postingStyle: .whenIdle)
print("Posted")
queue.enqueue(Notification(name: .test), postingStyle: .whenIdle)
print("Posted")
queue.enqueue(Notification(name: .test), postingStyle: .whenIdle)
print("Posted")
Это напечатает:
Опубликовано
Опубликовано
Размещено
Получено уведомление
Поскольку три уведомления могут быть объединены до их доставки, когда цикл выполнения простаивает. Вы можете увидеть то же поведение с .asap
Наконец, рассмотрите:
queue.enqueue(Notification(name: .test), postingStyle: .whenIdle)
print("Posted")
queue.enqueue(Notification(name: .test), postingStyle: .whenIdle)
print("Posted")
queue.enqueue(Notification(name: .test), postingStyle: .now)
print("Posted")
Это напечатает:
Опубликовано
Опубликовано
Полученное уведомление
Отправлено
Первые два уведомления в очереди могут быть объединены с окончательным уведомлением, так как они все еще находятся в очереди, ожидая цикла выполнения. холостой ход. Одно уведомление будет немедленно доставлено на NotificationCenter
.
Таким образом, если вы всегда используете .now
для postingStyle
, то NotificationQueue
будет вести себя по существу так же, как отправка уведомления непосредственно наNotificationCenter
, но если вы используете другой стиль публикации, тогда уведомления в очереди могут быть объединены в одно уведомление.