启动程序后,我会启动第二个线程来完成一些后台工作。这个线程永远不会死,但我需要等待它完成它正在做的事情才允许主线程继续。
在等待第二个线程更新状态时,如何阻止和恢复主线程?
答案 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" ....];
});
请注意,您希望它是异步还是同步取决于您。