等待后台线程的标志

rui*_*eco 1 cocoa multithreading objective-c

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

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

bbu*_*bum 7

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

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

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

然后,当你的后台线程完成后,使用任何各种机制来调度到主线程(GCD,performSelector:...等等),然后使"初始化"模态消失.

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


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

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

 [someObject performSelectorOnMainThread:@selector(sshConnectionEstablished:) withObject:nil];
Run Code Online (Sandbox Code Playgroud)

其中someObject可能有可能是您的应用程序委托.

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

 dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] postNotificationNamed:@"MySSHConnectionEstablished" ....];
 });
Run Code Online (Sandbox Code Playgroud)

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