【问题标题】:Run NSTask synchronously同步运行 NSTask
【发布时间】:2020-07-19 18:21:11
【问题描述】:

我有一个 .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,等到执行结束?

【问题讨论】:

标签: objective-c macos nstask


【解决方案1】:

似乎问题出在open 命令中,该命令执行应用程序并返回上下文,即使执行未结束。

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

-W, --wait-apps 阻塞,直到使用的应用程序关闭(即使它们已经在运行)。

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

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];

【讨论】:

  • 如果这个答案解决了你的问题,请接受它(即使是你的问题),它完全有效。它有助于保持清洁,也可以节省其他人的时间,因为他们认为它已回答并可以帮助解决其他问题。谢谢。
  • 是的,我知道,我正在等待明天,因为 SO 只允许我这样做......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 2011-10-17
相关资源
最近更新 更多