[英]Running xcodebuild twice from a Cocoa app (via NSTask) silently fails
[英]Send value from NSTextField to constantly running 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];
我已经阅读了NSPipe
和NSTask
以及所有内容,但我似乎无法回答我的问题:
NSTextView
或NSTableView
。 NSTextField
输入 编辑: 或者我应该使用launchd
? 我该怎么办?
您需要创建两个管道:一个用于任务的标准输入,另一个用于任务的标准输出。 你正在做什么现在将任务的输出连接到它自己的输入。
像这样的东西:
@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:
消息发送到ServerController
实例的standardInput
属性来写入服务器。 为了从服务器读取,你要为使用readInBackgroundAndNotify
或readabilityHandler
上standardOutput
财产。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.