NSOperationqueue我想阻止主线程

时间:2010-05-13 13:31:42

标签: iphone objective-c

我想阻止主线程,直到在后台完成其他操作。

我用过:

result=[self performSelectorInBackground:@selector(calculate:) withObject:expression];

请注意这一行,我正在使用结果:

[self use:result];

我不想在结果可用之前使用结果。  实现这个我实现了

-calculate:
{
    [[(AppDelegate *)[[UIApplication sharedApplication] delegate] queue] waitUntilAllOperationsAreFinished];
    calculating result...
}

然而,结果在计算之前使用。所以,我没有阻止主线程。请帮助我做到这一点。

感谢

2 个答案:

答案 0 :(得分:4)

你不想阻止主线程;它会阻止用户使用UI。

您想要的是在准备就绪后使用在后台获得的结果。

一种方法是在后台调用的方法结束时调用-use::你定义

-(void)calculate:(NSString*)input 
{
    .... do the calculation ...
    [self performSelectorOnMainThread:@selector(use:) withObject:result];
}

然后你只需从主线程

调用
[self performSelectorInBackground:@selector(calculate:) withObject:expression];

这样,您可以在不阻塞主线程的情况下实现您想要的目标。

顺便说一下,-performSelectorInBackgronudNSOperationQueue无关。因此[queue waitUntilAllOperationsAreFinished]不会等待-performSelectorInBackground调用的方法的执行。 无论如何,除非绝对必要,否则你不得打电话给waitUntilAllOperationAreFinished

要知道NSOperation何时完成,您可以KVC财产isFinished。请参阅NSOperation reference

答案 1 :(得分:0)

Yuji有正确的答案,可以阻止您的用户界面冻结。

但是,如果确实希望主线程被阻止,那么将计算转移到另一个线程是毫无意义的。只需在主线程上执行即可。即。

result = [self calculate: expression];

保证“阻止”当前线程直到完成。如果在主线程上执行,它将“阻塞”主线程。