gpt4 book ai didi

macos - 如何在 Cocoa 应用程序中获取 "continous"终端执行输出?

转载 作者:行者123 更新时间:2023-12-03 16:18:35 25 4
gpt4 key购买 nike

以其他方式询问:

例如,当我克隆 git 存储库时,终端输出如下:

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克隆”或类似的),我无法获得完整的输出流程

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

我对 Cocoa 还很陌生(我主要做 iOS),所以我不知道如何解决这个问题。

最佳答案

您正在阻止“readDataToEndOfFile” - 相反,您需要使用“readInBackgroundAndNotify”。

关于macos - 如何在 Cocoa 应用程序中获取 "continous"终端执行输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17172228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com