我想阻止主线程,直到在后台完成其他操作。
我用过:
result=[self performSelectorInBackground:@selector(calculate:) withObject:expression];
请注意这一行,我正在使用结果:
[self use:result];
我不想在结果可用之前使用结果。 实现这个我实现了
-calculate:
{
[[(AppDelegate *)[[UIApplication sharedApplication] delegate] queue] waitUntilAllOperationsAreFinished];
calculating result...
}
然而,结果在计算之前使用。所以,我没有阻止主线程。请帮助我做到这一点。
感谢
答案 0 :(得分:4)
你不想阻止主线程;它会阻止用户使用UI。
您想要的是在准备就绪后使用在后台获得的结果。
一种方法是在后台调用的方法结束时调用-use:
:你定义
-(void)calculate:(NSString*)input
{
.... do the calculation ...
[self performSelectorOnMainThread:@selector(use:) withObject:result];
}
然后你只需从主线程
调用[self performSelectorInBackground:@selector(calculate:) withObject:expression];
这样,您可以在不阻塞主线程的情况下实现您想要的目标。
顺便说一下,-performSelectorInBackgronud
与NSOperationQueue
无关。因此[queue waitUntilAllOperationsAreFinished]
不会等待-performSelectorInBackground
调用的方法的执行。
无论如何,除非绝对必要,否则你不得打电话给waitUntilAllOperationAreFinished
。
要知道NSOperation
何时完成,您可以KVC财产isFinished
。请参阅NSOperation reference。
答案 1 :(得分:0)
Yuji有正确的答案,可以阻止您的用户界面冻结。
但是,如果确实希望主线程被阻止,那么将计算转移到另一个线程是毫无意义的。只需在主线程上执行即可。即。
result = [self calculate: expression];
保证“阻止”当前线程直到完成。如果在主线程上执行,它将“阻塞”主线程。