NSTASK数据由newline n分开



我是Objective-C的新手,所以如果我缺少某些东西,请原谅我。但是我们都必须从某个地方开始:)

我有一个我从另一个开源项目中获得的代码段,该项目执行命令并将结果传递给另一种方法。我需要做的是聆听打印以进行stdout并对每行做某事的每条新行。

我与之合作的代码段如下:

    NSMutableArray *args  = [NSMutableArray array];
    NSString *input = [details valueForKey:@"input"];
    for (NSString *i in [input componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]) {
        [args addObject:i];
    }
    NSTask *scriptTask = [NSTask new];
    NSPipe *outputPipe = [NSPipe pipe];
    if ([_NSFileManager() isExecutableFileAtPath:scriptPath] == NO) {
        NSArray *chmodArguments = @[@"+x", scriptPath];
        NSTask *chmod = [NSTask launchedTaskWithLaunchPath:@"/bin/chmod" arguments:chmodArguments];
        [chmod waitUntilExit];
    }
    [scriptTask setStandardOutput:outputPipe];
    [scriptTask setLaunchPath:scriptPath];
    [scriptTask setArguments:args];
    NSFileHandle *filehandle = [outputPipe fileHandleForReading];
    [scriptTask launch];
    [scriptTask waitUntilExit];
    NSData *outputData = [filehandle readDataToEndOfFile];
    NSString *outputString  = [NSString stringWithData:outputData encoding:NSUTF8StringEncoding];
    if (NSObjectIsNotEmpty(outputString)) {
        [self.world.iomt inputText:outputString command:IRCPrivateCommandIndex("privmsg")];
    }

因此,我不仅要等待过程完成,然后对结果进行操作,而需要等待命令打印的每条新行以stdout。

我的背景主要在Web Dev中,所以我想如果您使用的是node.js和事件发射器,我的目标看起来与以下内容相似:

task = new Task("ls");
task.addListener("newline", function(data) {
    somethingElse("sendmsg", data);
});
task.run();

希望您了解我要实现的目标。谢谢!

您可以做的就是在nsfilehandle中添加一个观察者,以通知您。

示例:

[fileHandler readInBackgroundAndNotify];
//Need to set NSTask output pipes
[self.task setStandardOutput: outputPipe];
[self.task setStandardError: outputPipe];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readFromTask:) name:NSFileHandleReadCompletionNotification object:fileHandler];
-(void)readFromTask:(NSNotification *)aNotifcation;
    {
        NSData *data = [[aNotifcation userInfo] objectForKey: NSFileHandleNotificationDataItem];
        if (data != 0) {
            NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                // Do something with the text
            [text release];
            [[aNotifcation object] readInBackgroundAndNotify];  
        }
    }

然后有一个通知您可以添加到任务何时完成的任务,以便您可以进行清理。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskEnded:) name:NSTaskDidTerminateNotification object:task];

- (void)taskEnded:(NSNotification *) aNotifcation
{
    NSData *data = [[aNotifcation userInfo] objectForKey: NSFileHandleNotificationDataItem];
    if (data != 0) {
        NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    [text release];
}
[self.task release];

}

因此,从您的代码中,您可以删除:

 [scriptTask waitUntilExit];

并将数据处理转移到通知中。

NSData *outputData = [filehandle readDataToEndOfFile];
NSString *outputString  = [NSString stringWithData:outputData encoding:NSUTF8StringEncoding];
if (NSObjectIsNotEmpty(outputString)) {
    [self.world.iomt inputText:outputString command:IRCPrivateCommandIndex("privmsg")];
}

这是一个大概的主意,有一个很好的帖子

http://www.cocoabuilder.com/archive/cocoa/306145-nstask-oddity-with-getting-stdout.html

相关内容

  • 没有找到相关文章

最新更新