如何在Cocoa应用程序中获得“连续”终端执行输出?

时间:2013-06-18 14:58:37

标签: macos cocoa terminal nstask

要求别人:

例如,当我克隆一个git repo时,终端输出如下:

Cloning into '/users/whatever'...
remote: Counting objects: 1764, done.
remote: Compressing objects: 100% (909/909), done.
remote: Total 1764 (delta 944), reused 1622 (delta 820)
Receiving objects: 100% (1764/1764), 395.83 KiB | 139 KiB/s, done.
Resolving deltas: 100% (944/944), done.

但是当我从Cocoa应用程序执行完全相同的命令时,它只输出:

Cloning into '/users/whatever'...

这两项任务都只执行,完成了自己的工作。我唯一的问题是我无法向前一个用户显示任何进展。


我原来的问题:

我可以愉快地在Cocoa中使用NSTask和NSPipe运行同步“终端命令”,如下所示。

-(NSString*)execute:(NSString*) command
{
    NSTask *task = [NSTask new];
    [task setLaunchPath:@"/bin/sh"];
    [task setArguments:[NSArray arrayWithObjects:@"-c", command, nil]];

    NSPipe *pipe = [NSPipe pipe];

        [task setStandardOutput:pipe];
        [task setStandardError:pipe];
        [task launch];

    NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile];
    [task waitUntilExit];

    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}

但是,当我启动一个具有“持续更新”输出的任务时(想到“git clone”或类似),我无法获得完整的outplot流程

如何克服这个? NSPipe有一些异步委托方法吗?或者我应该设置一个计时器并继续询问NSPipe实例的当前状态?还是NSTask?是否有可以实现的处理程序块?

我是Cocoa的新手(我主要是iOS),所以我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:4)

你在'readDataToEndOfFile'上阻止了 - 相反,你需要使用'readInBackgroundAndNotify'。