用nstask读取无穷无尽的输出

时间:2013-10-19 22:19:04

标签: objective-c pipe nstask

好的,这是我的问题。我有一个程序告诉我传感器的值,这个程序在终端运行,输出就是这样:

110

362

492

655

依此类推....无限期地以每秒4行(状态)的速度。 然后我需要在我的目标c程序中的级别栏中实时显示这些值。 我尝试使用这个代码Execute a terminal command from a Cocoa app,这基本上是使用nstask和管道。 我意识到程序在达到data = [file readDataToEndOfFile]时会卡住;我认为是因为等待完成程序或输出时永远不会结束。那么,有没有办法实时逐行获取这个传感器的状态?

这是我的代码,我只是更改ping google.com的命令,因为输出和类似的速率相同。

- (void) epocSender
{
NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/sbin/ping"];
NSArray *arguments;arguments = [NSArray arrayWithObjects: @"google.com", nil];
[task setArguments: arguments];
NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
[task launch];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedData:) name:NSFileHandleDataAvailableNotification object:file];
[file waitForDataInBackgroundAndNotify];
}

- (void)receivedData:(NSNotification *)notif {
    NSLog(@"notification received");
}

1 个答案:

答案 0 :(得分:2)

获取NSFileHandle以便从您的管道中读取并使用waitForDataInBackgroundAndNotify通知新数据。每次收到通知时,再次致电waitForDataInBackgroundAndNotify重新注册。