Связь с целевым приложением

В некоторых ситуациях необходимо связаться непосредственно с целевым приложением, а не положиться исключительно на предпочтительный файл. В этом разделе описывается использовать два метода — распределенные объекты и распределенные уведомления — для достижения этого.

Используя распределенные объекты

Распределенные объекты позволяют одному приложению связываться с объектом в другом приложении. Можно использовать распределенные объекты только в приложениях Какао.

Приложение, которому принадлежит объект, целевое приложение в этом случае, делает объект доступным для других приложений путем продажи объекта с кодом такой как

id serverObject; // Assume this exists.
NSConnection *theConnection;
 
theConnection = [NSConnection defaultConnection];
[theConnection setRootObject:serverObject];
[theConnection registerName:@“MyServer”];

где serverObject объект, определяющий ряд методов для внешнего использования. Эти методы могут обеспечить, низкий уровень «получают» и «устанавливают» средства доступа для параметров настройки приложения или высокоуровневых запросов и запросов. Для получения доступа к объекту другое приложение, такое как предпочтительная область, выполняет код такой как

NSConnection *theConnection;
id remoteObject;
 
theConnection = [NSConnection connectionWithRegisteredName:@“MyServer”
            host:nil];
remoteObject = [[theConnection rootProxy] retain];

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

x = [remoteObject defaultWidth];
[remoteObject setBackgroundColor:[NSColor redColor]];

Используя распределенные уведомления

Распределенные уведомления позволяют приложению широковещательно передавать сообщение к любому числу других приложений, не будучи должен знать, кто те другие приложения, или даже если существуют другие приложения. Каждый тип приложения — Какао, Углерод, BSD — могут использовать распределенные уведомления.

Приложение, целевое приложение в этом случае, выражает интерес к получению широковещательно переданного сообщения путем регистрации себя в распределенном центре уведомления системы, идентификации точно, какое сообщение или тип уведомления, это хочет получить. Тип уведомления определяется произвольной строкой, согласованной отправителем и получателем уведомления. Как пример, класс Какао NSWindow определяет тип уведомления NSWindowWillCloseNotification, который объект окна широковещательные сообщения, когда закрывается его окно. Любой другой объект может зарегистрироваться для получения этого уведомления. (Это уведомление, однако, является внутренним к отдельному приложению и не распределяется остальной части системы.)

В дополнение к сообщению приложение может идентифицировать определенный объект, отправляющий сообщение. Когда отправитель и получатель находятся в том же приложении — другими словами, с помощью нераспределенных уведомлений — наблюдаемый объект может быть чем-либо. При использовании распределенных уведомлений, тем не менее, объект должен быть строкой (CFString или NSString). Полезным выбором для наблюдаемой строки является идентификатор пакета целевого приложения.

В регистрации для уведомления приложение обеспечивает обратный вызов, который будет выполняться, когда это получает уведомление. Приложение тогда продолжается с его режимами работы. Для получения уведомления приложение должно ввести Базовую Основу выполненный цикл. Это происходит и для Какао выполненный цикл и для менеджера событий Углерода.

Для регистрации для получения уведомления приложение Какао выполняет код, такой как следующее:

NSString *observedObject = @“com.mycompany.example.PrefpaneTarget”;
NSDistributedNotificationCenter *center =
            [NSDistributedNotificationCenter defaultCenter];
[center addObserver: self
            selector: @selector(callbackWithNotification:)
            name: @“My Notification”
            object: observedObject];

Параметром наблюдателя является объект, на который вызывается метод обратного вызова. Метод обратного вызова, идентифицированный selector параметр и реализованный объектом наблюдателя, имеет подпись

- (void)callbackWithNotification:(NSNotification *)myNotification;

Объект NSNotification, переданный этому методу, содержит конкретный объект и полученное уведомление.

Аналогичный код для Углерода или приложения BSD с помощью Базовой Основы

void *observer;
CFStringRef observedObject =
            CFSTR(“com.mycompany.example.PrefpaneTarget”);
CFNotificationCenterRef center =
            CFNotificationCenterGetDistributedCenter();
CFNotificationCenterAddObserver(center, observer, myCallbackFntn,
            CFSTR(“My Notification”), observedObject,
            CFNotificationSuspensionBehaviorDeliverImmediately);

с прототипом функции обратного вызова

(void)myCallbackFntn(CFNotificationCenterRef center, void *observer,
            CFStringRef notificationName, const void *observedObject,
            CFDictionaryRef userInfo);

Поскольку обратный вызов является функцией вместо вызова метода, observer параметром являются любые дополнительные данные (в форме указателя), что Вы хотите передать функции обратного вызова.

Затем, широковещательное применение — Ваша предпочтительная область — отправляет уведомление. Это вызывает центр уведомления системы, говорит центру, какое уведомление отправить, и дополнительно передает словарь, содержащий дополнительную информацию. Словарь может использоваться для передачи измененных предпочтений непосредственно приложению. Или, предпочтительная область может принять решение не использовать словарь и вместо этого выписать изменения в диске. Уведомление тогда используется, чтобы сказать приложению обновлять свои предпочтения от диска.

Код какао для отправки уведомления похож на это:

NSString *observedObject = @“com.mycompany.example.PrefpaneTarget”;
NSDistributedNotificationCenter *center =
            [NSDistributedNotificationCenter defaultCenter];
[center postNotificationName: @“My Notification”
            object: observedObject
            userInfo: nil /* no dictionary */
            deliverImmediately: YES];

Базовый код Основы похож на это:

CFStringRef observedObject =
            CFSTR(“com.mycompany.example.PrefpaneTarget”);
CFNotificationCenterRef center =
            CFNotificationCenterGetDistributedCenter();
CFNotificationCenterPostNotification(center, CFSTR(“My Notification”),
            observedObject, NULL /* no dictionary */, TRUE);

Центр уведомления ищет все приложения, зарегистрировавшиеся для получения данного типа уведомления из детали observedObject. Это тогда уведомляет цикл выполнения каждого приложения уведомления и дает ему копию словаря. Выбранная функция обратного вызова или метод выполняются во время следующего приложения, проходят через его цикл выполнения.

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