class NotificationCenter : NSObject
Notification Center — это механизм, осуществляющий доставку данных о событиях до подписанных на эти события наблюдателей (observers). Отслеживаемые события могут быть как системные (например появление/скрытие клавиатуры, изменение ориентации экрана), так и собственные.
По умолчанию экземпляр Notification Center в приложении доступен через конструкцию NotificationCenter.default
. Но при необходимости можно создать дополнительные экземпляры Notification Center, для того, чтобы разграничить передачу данных о событиях.
Все передаваемые с помощью Notification Center события — это экземпляры структуры Notification
(используется по умолчанию) или класса NSNotification
(используется в старых версиях операционных систем при разработке на Objective-C, а также когда необходима ссылочная семантика).
ПРИМЕЧАНИЕ
Notification Center не имеет ничего общего с push-уведомлениями, локальными уведомлениями или с отображением уведомлений в системе.
Для создания наблюдателя используется метод addObserver
.
NotificationCenter.default.addObserver( %наблюдатель%, selector: %метод, выполняемый при поступлении события%, name: %Событие, за которым необходимо наблюдать%, object: %передаваемый объект% )
Selector
должен указывать на метод, принимающий в качестве входного параметра значение типа Notification
.
@objc func keyboardWillHide(_ notification: Notification) { // ... }
Аргумент name
определяет событие, за которым будет вестись наблюдение. Классы UIResponder
и Notification.Name
имею большое количество встроенных событий, например:
UIResponder.keyboardWillShowNotification
— клавиатура будет отображенаUIResponder.keyboardDidShowNotification
— клавиатура была отображенаUIResponder.keyboardWillHideNotification
— клавиатура будет скрытаUIResponder.keyboardDidHideNotification
— клавиатура была скрытаUIResponder.keyboardWillChangeFrameNotification
— у клавиатуры будет изменен frame
UIResponder.keyboardDidChangeFrameNotification
— у клавиатуры был изменен frame
Notification.Name.NSBundleResourceRequestLowDiskSpace
— низкий объем доступного дискового пространстваNotification.Name.CKAccountChanged
— статус аккаунт iCloud изменен (используется при работе с CloudKit
).Notification.Name.NSSystemClockDidChange
— системные часы были измененыи многое-многое другое.
Для указания на отслеживаемое событие во входной параметр name
метода addObserver
передается значение типа Notification.Name
. При необходимости можно создать собственное событие с помощью инициализатора данного типа.
NotificationCenter.default.addObserver( %наблюдатель%, selector: %метод, выполняемый при поступлении события%, name: Notification.Name("userDidLogout"), object: %передаваемый объект% )
В данном примере создается наблюдатель за событием userDidLogout
.
Теперь, чтобы отправить данное событие в произвольном месте проекта у экземпляра класса NotificationCenter
необходимо вызвать метод post
.
NotificationCenter.default.post(name: NotificationCenter.Name("userDidLogout"), object: nil)
В качестве аргумента object
может быть передан произвольный объект, который будет извлечен внутри вызываемого метода с помощью конструкции object
входного параметра типа Notification
, например:
@objc func userDidLogout(_ notification: Notification) { let user = notification.object }
// появление клавиатуры NotificationCenter.default.addObserver( self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil )
// скрытие клавиатуры NotificationCenter.default.addObserver( self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil )