我有一个多线程程序,需要一次运行许多可执行文件并等待它们的结果。
I use [nstask waitUntilExit]
in an NSOperationQueue
在非主线程上运行它(运行NSTask
在主线程上是完全不可能的)。
我的程序随机崩溃或遇到断言失败,并且崩溃堆栈始终指向运行的运行循环waitUntilExit
,它执行各种回调和处理程序,包括(恕我直言,错误地)KVO 和更新 UI 的绑定,这导致它们在非主线程上运行(它是可能是迈克·阿什描述的问题)
我怎样才能安全使用waitUntilExit
?
是不是一个问题waitUntilExit
本质上不可用,或者在使用 KVO 和 IB 绑定时我是否需要做一些特殊的事情(除了在主线程上显式安排我的回调之外)以防止它们在错误的运行线程上处理waitUntilExit
?
正如迈克·阿什(Mike Ash)指出的那样,你不能打电话waitUntilExit
在随机运行循环上。很方便,但是没用。您必须在计算“这实际上方便吗?”时包括“不起作用”。
但是,您可以使用terminationHandler
在 10.7+ 中。它不会泵送运行循环,因此不应产生此问题。您可以重新创建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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)