Разработка пользовательского агента без графического интерфейса в Objective-C с использованием NSDistributedNotificationCenter - PullRequest
2 голосов
/ 14 декабря 2011

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

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

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

1 Ответ

4 голосов
/ 14 декабря 2011

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;
}
...