2011-12-14 1 views
2

Я хотел бы создать пользовательский агент в Objective-C, который прослушивает уведомления по умолчанию NSDistributedNotificationCenter. У агента нет графического интерфейса. Когда я создаю приложение Cocoa (я также буду использовать Distributed Objects, который, я думаю, только в Cocoa), в Xcode, Xcode устанавливает проект как графическое приложение.Разработка пользовательского агента без GUI в Objective-C с использованием NSDistributedNotificationCenter

В основной функции я удаляю вызов функции NSApplicationMain(...), чтобы удалить элементы GUI из приложения. Однако теперь я не могу заставить поток ждать (слушать) уведомлений, поступающих с NSDistributedNotificationCenter. Приложение только начинается и немедленно завершает работу.

Я посмотрел в использовании NSRunLoop из текущего NSThread, однако, кажется, что NSRunLoop подождем только на NSPort с. Там нет упоминания о ожидании на NSNotifications.

+1

Если вы имеете в виду 'NSProxy' и' NSDistantObject' и весь этот беспорядок, то это в Foundation, а не AppKit (оба из которых являются Cocoa). Вам не нужен AppKit для распределенных объектов. Однако вы можете посмотреть XPC. Это новое в Lion, но в зависимости от того, что вы делаете, это может быть намного проще, чем использование удаленных объектов. –

+0

@JasonCoco Спасибо за информацию. Я взглянул на XPC. Кажется, что XPC - это способ разбить ваше приложение на отдельные «процессы», так что если один из процессов завершится с ошибкой, это не повлияет на другой процесс. Например, если я пишу приложение типа Mail.app, я могу написать сборщик писем в одном процессе, а почтовый читатель - в другом. Если сбой почтового отправителя, я все равно могу прочитать загруженную почту. Это было мое впечатление от использования XPC. В моем случае я пишу архитектуру клиент-сервер, и мне нужен сетевой доступ (а не только IPC). –

+1

Хорошо. В этом случае вы можете просто написать программу Foundation. –

ответ

4

NSDistributedNotificationCenter Фонд, поэтому вам не нужно создавать графическое приложение. Например, вы можете создать шаблон командной строки и запустить его с терминала. В качестве очень простого примера вы можете создать пример, который просто распечатывает каждое распределенное уведомление, которое оно получает ниже.

Чтобы создать, скопируйте в шаблон Xcode для приложения командной строки Foundation или просто скопируйте его в текстовый файл с именем test_note.m и создайте в соответствии с комментариями. В этом примере приложение никогда не закончится (CFRunLoopRun() никогда не вернется), и вам придется убить его, нажав CTRL + C с терминала или убив его чем-то вроде kill или монитора активности.

// test_build.m 
// to build: clang -o test_build test_build.m -framework foundation 

#import <Foundation/Foundation.h> 

@interface Observer : NSObject 

- (void)observeNotification:(NSNotification*)note; 

@end 

@implementation Observer 

- (void)observeNotification:(NSNotification*)note 
{ 
    NSLog(@"Got Notification: %@", note); 
} 

@end 

int main (int argc, char const *argv[]) 
{ 
    @autoreleasepool { 
    Observer* myObserver = [[Observer alloc] init]; 
    [[NSDistributedNotificationCenter defaultCenter] addObserver:myObserver selector:@selector(observeNotification:) name:nil object:nil]; 
    CFRunLoopRun(); 
    } 
    return 0; 
} 
+0

Я вижу. Таким образом, приложение «Cocoa», Xcode действительно спрашивает, хотите ли вы создать графическое приложение. Я мог бы очень хорошо написать приложение CLI и просто #import библиотеки Cocoa, если это необходимо. Верный? –

+1

Да, в шаблоне шаблонов Xcode шаблон приложения «Какао» предназначен для приложения AppKit. Вы можете написать инструмент командной строки, который использует AppKit, но есть много предостережений, вам нужно убедиться, что вы подключаетесь к оконному серверу, чтобы некоторые вещи работали правильно, другие вещи просто не будут и т. Д. В принципе, из шаблона инструмента «Командная строка» вы получаете все Foundation и CoreFoundation. Вы можете добавить другие фреймворки Cocoa, такие как CoreData и т. Д. Если вы хотите использовать что-то из AppKit, вам нужно более внимательно изучить документы. –

+0

Звучит неплохо. Кстати, с вышеупомянутым решением, было бы это можно использовать, если я запускаю приложение с помощью launchctl (запуска) в качестве пользовательского агента? Я прочитал эту документацию, и кажется, что они рекомендуют, чтобы приложения работали «по требованию». Однако, похоже, что в файле конфигурации launchd, я могу указать только порт для прослушивания, в котором launchd запускает мое приложение. Тем не менее, я не уверен, как получить эту работу с NSDistributedNotificationCenter. Возможно, было бы лучше, если бы мой агент пользователя был «жив»? –

 Смежные вопросы

  • Нет связанных вопросов^_^