运行 NSTask 同步

Run NSTask synchronously

我有一个 .app 文件,我正在 运行 处理 NSTask,我希望在 .app 执行结束之前阻塞线程。

我当前的代码是:

NSTask *task = [[NSTask alloc] init];
task.launchPath = @"/bin/bash";
task.arguments = [NSArray arrayWithObjects:@"-c", "/usr/bin/open myApp.app", nil];
[task launch];
[task waitUntilExit]; // doesn't guarantee task will wait until exit according to docs

我知道我可以使用 NSTask.terminationHandler 但由于我有很多任务,我不想陷入回调地狱的情况(而且我也不在乎是否一切都会 运行 同步并花一些时间)

(我也试过在执行命令中添加nohup,但没有达到我想要的效果。)

有没有办法同步执行NSTask,等到执行结束?

似乎问题出在执行应用程序和 return 上下文的 open 命令中,即使执行尚未结束。

我发现 open 有一个 -W 参数:

-W, --wait-apps Blocks until the used applications are closed (even if they were already running).

添加这个参数解决了我的问题。 最终代码:

NSTask *task = [[NSTask alloc] init];
task.launchPath = @"/bin/bash";
task.arguments = [NSArray arrayWithObjects:@"-c", "/usr/bin/open -W myApp.app", nil];
[task launch];
[task waitUntilExit];