Регистрация для уведомления

Можно зарегистрироваться для уведомлений из собственного приложения или других приложений. Посмотрите Регистрацию для Локальных Уведомлений для прежнего и Регистрацию для Распределенных Уведомлений для последнего. Чтобы не зарегистрироваться для уведомления, которое должно быть сделано, когда Ваш объект освобожден, посмотрите Нерегистрацию Наблюдателя.

Регистрация для локальных уведомлений

Вы регистрируете объект получить уведомление путем вызова метода центра уведомления 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 метод идентифицирует, как поступающие уведомления должны быть обработаны, в то время как приостановлена поставка. Существует четыре различных типов поведения приостановки, каждый полезный при различных обстоятельствах.

Поведение приостановки

Описание

NSNotificationSuspensionBehaviorDrop

Сервер не ставит уведомлений в очередь с этим именем и объектом, пока это не получает setSuspended:NO сообщение.

NSNotificationSuspensionBehaviorCoalesce

Очереди сервера только последнее уведомление об указанном имени и объекте; отбрасываются более ранние уведомления. В методах покрытия, за которые поведение приостановки не является явным параметром, NSNotificationSuspensionBehaviorCoalesce значение по умолчанию.

NSNotificationSuspensionBehaviorHold

Сервер содержит все уведомления соответствия, пока очередь не была переполнена (размер очереди, определенный сервером), в которой точке сервер может сбросить поставленные в очередь уведомления.

NSNotificationSuspensionBehaviorDeliverImmediately

Сервер поставляет уведомления, соответствующие эту регистрацию независимо от того, получило ли это setSuspended:YES сообщение. Когда уведомление с этим поведением приостановки является соответствующим, это имеет эффект первого сбрасывания любых уведомлений с очередями. Эффект состоит в том, как будто сервер получил setSuspended:NO в то время как приложение приостановлено, сопровождаемое рассматриваемым уведомлением, поставляемым, сопровождаемый переходом назад к предыдущему приостановленному или неприостановленному состоянию.

Вы приостанавливаете уведомления путем отправки setSuspended:YES к распределенному центру уведомления. В то время как уведомления приостановлены, сервер уведомления обрабатывает уведомления, предназначенные для процесса, приостановившего поставку уведомления согласно поведению приостановки, указанному наблюдателями, когда они зарегистрировались для получения уведомлений. Когда поставка уведомления резюме процесса, все уведомления с очередями сразу поставлены. В приложениях с помощью Набора Приложения, NSApplication когда приложение не активно, объект автоматически приостанавливает поставку уведомления.

Обратите внимание на то, что уведомление предназначило для наблюдателя, зарегистрировавшегося в NSNotificationSuspensionBehaviorDeliverImmediately, автоматически сбрасывает очередь, когда она поставлена, заставив все уведомления с очередями быть поставленной в то время также.

Состояние ожидания может быть переопределено плакатом уведомления. Если уведомление является срочным, таким как предупреждение закрываемого сервера, плакат может вынудить уведомление быть сразу поставленным всем наблюдателям путем регистрации уведомления с NSDistributedNotificationCenter postNotificationName:object:userInfo:deliverImmediately: метод с deliverImmediately параметром YES.

Нерегистрация наблюдателя

Прежде чем объект, наблюдающий уведомления, освобожден, он должен сказать центру уведомления прекращать отправлять ему уведомления. Иначе, следующее уведомление отправляется в несуществующий объект и катастрофические отказы программы. Можно отправить следующее сообщение для завершенного удаления объекта как наблюдатель локальных уведомлений, независимо от того, сколько объектов и уведомлений, для которых оно зарегистрировало себя:

[[NSNotificationCenter defaultCenter] removeObserver:self];

Поскольку отправляют наблюдатели распределенных уведомлений:

[[NSDistributedNotificationCenter defaultCenter] removeObserver:self];

Используйте более определенное removeObserver... методы, указывающие имя уведомления и наблюдаемый объект, чтобы выборочно не зарегистрировать объект для определенных уведомлений.