要问别的:
例如,当我克隆一个 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”或类似的)时,我无法获得完整的输出流。
如何克服这一点?NSPipe 有一些异步委托方法吗?还是我应该设置一个计时器并继续询问 NSPipe 实例的当前状态?还是NSTask?有我可以实现的处理程序块吗?
我对 Cocoa 很陌生(我主要做 iOS),所以我不知道如何处理这个问题。