1
我为NSFileHandleReadCompletionNotification
设置了NSNotification。NSTask管道输出到控制台而不是NSFileHandle
我用两个独立的管道设置了标准I/O。
NSPipe * input = NSPipe.new;
NSPipe * output = NSPipe.new;
[serverTask setStandardInput:input];
[serverTask setStandardOutput:output];
我启动一个执行Java jar的NSTask,并开始读取数据。
[[serverTask.standardOutput fileHandleForReading] readInBackgroundAndNotify];
,我连续读取数据,并附加一个NSTextView
的数据,如果它是新的数据:
- (void)serverLogHasChanged:(NSNotification *)notification
{
[[serverTask.standardOutput fileHandleForReading] readInBackgroundAndNotify];
NSData * newData = [notification.userInfo objectForKey:NSFileHandleNotificationDataItem];
if (newData != nil && availableData != newData)
{
NSMutableString * serverLogString = [NSMutableString stringWithString:serverLog.string];
[serverLogString appendString:[NSString.alloc initWithData:newData encoding:NSUTF8StringEncoding]];
[serverLog setString:serverLogString];
[serverLog.enclosingScrollView.contentView scrollPoint:NSMakePoint(0, NSMaxY(serverLog.enclosingScrollView.contentView.bounds))];
}
newData = availableData;
}
但是,我越来越陌生输出到NSTextView
那些“>”字符应该是实际输出的行,而是输出结束于Xcode的控制台。
换句话说,控制台正在打印输出,而不是打印出输出新行的指示的输出NSPipe
。
嗯,我的工艺包装?你有没有尝试将任务的输出设置为'[NSFileHandle fileHandleWithStandardOutput]'? – 2012-02-01 15:41:03
是的。如果我这样做,我在NSTextView和现在在控制台中没有任何东西:'174食谱 27成就 > 10:46:49 [INFO]启动我的世界服务器版本1.1 > 10:46:49 [INFO ] Loading properties > 10:46:49 [INFO]在本地主机上启动Minecraft服务器:25565 > etc ... – evdude100 2012-02-01 15:48:05
您尝试捕捉的输出有没有机会出现标准错误?如果是这样,你也需要捕获它。 – CRD 2012-02-01 16:37:43