Отправить значение из NSTextField в постоянно работающий NSTask - PullRequest
0 голосов
/ 28 ноября 2011

Была пара вопросов, связанных с NSTask, но после их просмотра я все еще не представляю, что делать.

Я пишу интерфейс для java-сервера в Какао, запущенного java -Xmx1024M -Xms1024M -jar server.jar nogui (я пропустил аргумент nogui в моем текущем коде, чтобы не заполнять мой компьютер ненужными потерянными экземплярами сервера ).

Мой текущий код правильно запускает файл .jar; теперь мне нужен способ для захвата (и анализа) вывода и отправки ввода в процесс.

server = [[NSTask alloc] init];
pipe = [NSPipe pipe];
NSArray *args = [NSArray arrayWithObjects:@"-Xms1024M",
                    @"-Xmx1024M",
                    @"-jar",
                    @"server.jar",
                    nil];

[server setLaunchPath:@"/usr/bin/java"];
[server setCurrentDirectoryPath:@"MyApp.app/Contents/Resources/"];
[server setArguments:args];
[server setStandardOutput:pipe];
[server setStandardInput:pipe];
[server launch];

Я прочитал NSPipe и NSTask и все, но я не могу представить ответ, направленный на мою проблему:

  • Вывод в реальном времени, анализ (RegEx?) На NSTextView или NSTableView.
  • Ввод от NSTextField

РЕДАКТИРОВАТЬ: Или я должен использовать launchd? Как бы я это сделал?

1 Ответ

3 голосов
/ 28 ноября 2011

Вам нужно создать две трубы: одну для стандартного ввода задачи, а другую для стандартного вывода задачи. То, что вы делаете сейчас, соединяет вывод задачи с собственным входом.

Примерно так:

@interface ServerController : NSObject
@property (strong) NSFileHandle *standardInput;
@property (strong) NSFileHandle *standardOutput;
@end

@implementation ServerController

...

- (void)launchServer {
    NSPipe *standardInputPipe = [NSPipe pipe];
    self.standardInput = standardInputPipe.fileHandleForWriting;
    NSPipe *standardOutputPipe = [NSPipe pipe];
    self.standardOutput = standardOutputPipe.fileHandleForReading;
    ...
    server.standardInput = standardInputPipe;
    server.standardOutput = standardOutputPipe;
    [server launch];
}

...

Теперь вы можете написать на сервер, отправив сообщение writeData: в свойство standardInput экземпляра ServerController. Для чтения с сервера вы можете использовать readInBackgroundAndNotify или readabilityHandler в свойстве standardOutput.

...