Регистрация для уведомления
Можно зарегистрироваться для уведомлений из собственного приложения или других приложений. Посмотрите Регистрацию для Локальных Уведомлений для прежнего и Регистрацию для Распределенных Уведомлений для последнего. Чтобы не зарегистрироваться для уведомления, которое должно быть сделано, когда Ваш объект освобожден, посмотрите Нерегистрацию Наблюдателя.
Регистрация для локальных уведомлений
Вы регистрируете объект получить уведомление путем вызова метода центра уведомления addObserver:selector:name:object:
, указывая наблюдателя, сообщение, которое центр уведомления должен отправить наблюдателю, имени уведомления, которое это хочет получить, и о который объект. Вы не должны указывать и имя и объект. Если Вы укажете только объект, то наблюдатель получит все уведомления, содержащие тот объект. Если Вы укажете только имя уведомления, то наблюдатель получит то уведомление каждый раз, когда это отправляется, независимо от объекта, связанного с ним.
Для наблюдателя возможно зарегистрироваться для получения больше чем одного сообщения для того же уведомления. В таком случае наблюдатель получит все сообщения, которые он регистрируется для получения для уведомления, но не может быть определен порядок, в котором он получает их.
Если Вы позже решаете, что наблюдатель больше не должен получать уведомления (например, если наблюдатель освобождается), можно удалить наблюдателя из списка центра уведомления наблюдателей с методами removeObserver:
или removeObserver:name:object:
.
Обычно, Вы регистрируете объекты в центре уведомления процесса по умолчанию. Вы получаете объект по умолчанию с помощью defaultCenter
метод класса.
Как пример использования центра уведомления для получения уведомлений предположите, что Вы хотите выполнить работу любое время, окно становится основным (например, при реализации контроллера для панели инспектора). Вы зарегистрировали бы свой объект клиента как наблюдатель как показано в следующем примере:
[[NSNotificationCenter defaultCenter] addObserver:self |
selector:@selector(aWindowBecameMain:) |
name:NSWindowDidBecomeMainNotification object:nil]; |
Путем передачи nil
как объект наблюдать, объект клиента (self
) когда любой объект отправляет a, уведомляется NSWindowDidBecomeMainNotification
уведомление.
Когда окно становится основным, оно отправляет NSWindowDidBecomeMainNotification
к центру уведомления. Центр уведомления уведомляет всех наблюдателей, интересующихся уведомлением путем вызова метода, из которого они указали в селекторном параметре addObserver:selector:name:object:
. В случае нашего наблюдателя в качестве примера селектор aWindowBecameMain:
. aWindowBecameMain:
метод мог бы иметь следующую реализацию:
- (void)aWindowBecameMain:(NSNotification *)notification { |
NSWindow *theWindow = [notification object]; |
MyDocument = (MyDocument *)[[theWindow windowController] document]; |
// Retrieve information about the document and update the panel. |
} |
NSWindow
объекты ничего не должны знать о Вашей панели инспектора.
Регистрация для распределенных уведомлений
Объект регистрирует себя для получения уведомления путем отправки addObserver:selector:name:object:suspensionBehavior:
метод к NSDistributedNotificationCenter
объект, указывая сообщение, которое уведомление должно отправить, имя уведомления, которое это хочет получить, строка идентификации для соответствия (объектный параметр), и поведение следовать, если приостановлена поставка уведомления.
Поскольку объект регистрации и наблюдатель могут быть в различных процессах, уведомления не могут содержать указатели на произвольные объекты. Поэтому NSDistributedNotificationCenter
класс требует, чтобы уведомления использовали NSString
возразите как объектный параметр. Уведомление, соответствующее, сделано на основе этой строки, а не объектного указателя. Необходимо проверить документацию объекта, отправляющего уведомление для наблюдения то, что это использует в качестве его строки идентификации.
Когда процесс больше не интересуется получением уведомлений сразу, это может приостановить поставку уведомления. Когда приложение скрыто или помещается в фон, это часто делается. ( NSApplication
когда приложение не активно, объект автоматически приостанавливает поставку.) suspensionBehavior параметр в addObserver
метод идентифицирует, как поступающие уведомления должны быть обработаны, в то время как приостановлена поставка. Существует четыре различных типов поведения приостановки, каждый полезный при различных обстоятельствах.
Поведение приостановки |
Описание |
---|---|
Сервер не ставит уведомлений в очередь с этим именем и объектом, пока это не получает |
|
Очереди сервера только последнее уведомление об указанном имени и объекте; отбрасываются более ранние уведомления. В методах покрытия, за которые поведение приостановки не является явным параметром, |
|
Сервер содержит все уведомления соответствия, пока очередь не была переполнена (размер очереди, определенный сервером), в которой точке сервер может сбросить поставленные в очередь уведомления. |
|
Сервер поставляет уведомления, соответствующие эту регистрацию независимо от того, получило ли это |
Вы приостанавливаете уведомления путем отправки setSuspended:YES
к распределенному центру уведомления. В то время как уведомления приостановлены, сервер уведомления обрабатывает уведомления, предназначенные для процесса, приостановившего поставку уведомления согласно поведению приостановки, указанному наблюдателями, когда они зарегистрировались для получения уведомлений. Когда поставка уведомления резюме процесса, все уведомления с очередями сразу поставлены. В приложениях с помощью Набора Приложения, NSApplication
когда приложение не активно, объект автоматически приостанавливает поставку уведомления.
Обратите внимание на то, что уведомление предназначило для наблюдателя, зарегистрировавшегося в NSNotificationSuspensionBehaviorDeliverImmediately
, автоматически сбрасывает очередь, когда она поставлена, заставив все уведомления с очередями быть поставленной в то время также.
Состояние ожидания может быть переопределено плакатом уведомления. Если уведомление является срочным, таким как предупреждение закрываемого сервера, плакат может вынудить уведомление быть сразу поставленным всем наблюдателям путем регистрации уведомления с NSDistributedNotificationCenter postNotificationName:object:userInfo:deliverImmediately:
метод с deliverImmediately параметром YES
.
Нерегистрация наблюдателя
Прежде чем объект, наблюдающий уведомления, освобожден, он должен сказать центру уведомления прекращать отправлять ему уведомления. Иначе, следующее уведомление отправляется в несуществующий объект и катастрофические отказы программы. Можно отправить следующее сообщение для завершенного удаления объекта как наблюдатель локальных уведомлений, независимо от того, сколько объектов и уведомлений, для которых оно зарегистрировало себя:
[[NSNotificationCenter defaultCenter] removeObserver:self]; |
Поскольку отправляют наблюдатели распределенных уведомлений:
[[NSDistributedNotificationCenter defaultCenter] removeObserver:self]; |
Используйте более определенное removeObserver...
методы, указывающие имя уведомления и наблюдаемый объект, чтобы выборочно не зарегистрировать объект для определенных уведомлений.