从NSTextField发送值到不断运行NSTask

时间:2011-11-28 01:56:50

标签: objective-c cocoa nstask

有几个NSTask相关问题,但在翻阅之后我仍然不知道该怎么做。

我正在为Cocoa中的java服务器编写一个前端,由java -Xmx1024M -Xms1024M -jar server.jar nogui启动(我在当前代码中遗漏了nogui arg,以免填满我的计算机孤立的服务器实例)。

我当前的代码正确运行.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];

我已经阅读了NSPipeNSTask以及所有内容,但我似乎无法回答我的问题:

  • 直播,解析(RegEx?)输出到NSTextViewNSTableView
  • 来自NSTextField
  • 的输入

编辑:或者我应该使用launchd?我该怎么做?

1 个答案:

答案 0 :(得分:3)

您需要制作两个管道:一个用于任务的标准输入,另一个用于任务的标准输出。你现在正在做什么将任务的输出连接到它自己的输入。

这样的事情:

@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媒体资源上使用readabilityHandlerstandardOutput