等待后台线程的标志

时间:2013-03-21 00:10:52

标签: objective-c multithreading cocoa

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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

然后,当你的后台线程完成后,使用各种机制调度到主线程(GCD,performSelector:...等等),然后使“初始化”模态消失。 / p>

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


  

我的后台线程没有完成,它或多或少永远存在。和我   需要它在主线程可以做到之前达到某个状态   的事情。

完全;所以,当它到达那个状态时,你可以使用:

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

someObject可能是您的申请代表。

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

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

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