1

在启动我的程序后,我启动了第二个线程来做一些后台工作。这个线程永远不会死,但我需要等待它完成它正在做的事情,然后才允许主线程继续。

在等待第二个线程更新其状态时,如何阻止和恢复主线程?

4

1 回答 1

7

首先,不要阻塞主线程。永远不会。在 iOS 上阻塞主线程足够长的时间会导致你的应用程序被杀死。在 OS X 上,它会导致死亡的彩虹披萨出现。

最终,阻塞主线程会导致您的应用程序无响应。

相反,让应用程序抛出一个模态对话框或模态表或其他一些状态指示器,表明应用程序正在做一些必须在继续进行之前完成的事情。确保“退出”菜单项仍处于启用状态,以防用户决定“哦,废话!没有时间!中止!中止!中止!”。

然后,当您的后台线程完成后,使用任何各种机制来分派到主线程(GCD、performSelector:...等...),然后使“初始化”模式消失。

根本不需要轮询、睡眠或 while(){}。


我的后台线程没有完成,它或多或少地永远存在。而且我需要它在主线程执行此操作之前达到某个状态。

确切地; 因此,当它达到该状态时,您可以使用:

 [someObject performSelectorOnMainThread:@selector(sshConnectionEstablished:) withObject:nil];

someObject您的应用程序委托可能在哪里。

或者您可以使用通知并执行以下操作:

 dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] postNotificationNamed:@"MySSHConnectionEstablished" ....];
 });

请注意,您希望它是异步还是同步取决于您。

于 2013-03-21T03:58:04.180 回答