我有一个多线程程序,需要一次运行许多可执行文件并等待它们的结果。
我在非主线程上运行的NSOperationQueue
中使用[nstask waitUntilExit]
(在主线程上运行NSTask
完全是不可能)。
我的程序随机崩溃或遇到断言失败,并且崩溃堆栈始终指向 waitUntilExit
运行的运行循环,该循环执行各种回调和处理程序,包括(恕我直言,错误地)KVO 和 bindings updating the UI ,这导致它们在非主线程上运行(它是 probably the problem described by Mike Ash )
如何安全地使用waitUntilExit
?
这是否是 waitUntilExit
本质上无法使用的问题,还是在使用 KVO 和 IB 绑定(bind)时我需要做一些特殊的事情(除了在主线程上显式调度我的回调)以防止它们在运行 waitUntilExit
的错误线程上进行处理?
最佳答案
正如 Mike Ash 指出的那样,您无法在随机运行循环上调用 waitUntilExit
。很方便,但是没用。您必须在计算“这实际上方便吗?”时包括“不起作用”
但是,您可以在 10.7+ 中使用 terminationHandler
。它不会泵送运行循环,因此不应产生此问题。您可以使用以下内容重新创建 waitUntilExit
(未经测试;可能无法编译):
dispatch_group group = dispatch_group_create();
dispatch_group_enter(group);
task.terminationHandler = ^{ dispatch_group_leave(group); };
[task launch];
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
// If not using ARC:
dispatch_release(group);
关于multithreading - 如何安全地在主线程中使用[NSTask waitUntilExit]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34996937/