Iphone NSOperationqueue我要阻止主线程
我想阻止主线程,直到在后台执行其他操作 我用过:Iphone NSOperationqueue我要阻止主线程,iphone,objective-c,Iphone,Objective C,我想阻止主线程,直到在后台执行其他操作 我用过: result=[self performSelectorInBackground:@selector(calculate:) withObject:expression]; 我正在使用的结果如下: [self use:result]; 在结果可用之前,我不想使用它。 为了实现这一点,我实施了 -calculate: { [[(AppDelegate *)[[UIApplication sharedApplication] delega
result=[self performSelectorInBackground:@selector(calculate:) withObject:expression];
我正在使用的结果如下:
[self use:result];
在结果可用之前,我不想使用它。
为了实现这一点,我实施了
-calculate:
{
[[(AppDelegate *)[[UIApplication sharedApplication] delegate] queue] waitUntilAllOperationsAreFinished];
calculating result...
}
尽管如此,在计算之前还是会使用结果。所以,我没有阻塞主线程。请帮我做那件事
谢谢您不想阻止主线程;它将阻止用户使用UI 您想要的是在准备好后使用在后台获得的结果 一种方法是调用
-在后台调用的方法末尾使用:
:您定义
-(void)calculate:(NSString*)input
{
.... do the calculation ...
[self performSelectorOnMainThread:@selector(use:) withObject:result];
}
然后你只需从主线程调用
[self performSelectorInBackground:@selector(calculate:) withObject:expression];
这样,您就可以在不阻塞主线程的情况下实现所需的功能
顺便说一下,-performSelectorInBackgronud
与NSOperationQueue
无关。因此,[queue waituntillallooperations definished]
不会等待执行由-performSelectorInBackground
调用的方法。
在任何情况下,除非绝对必要,否则不要在所有操作完成之前调用等待
要知道NSOperation
何时完成,您需要KVC属性isFinished
。请参阅。您不想阻止主线程;它将阻止用户使用UI
您想要的是在准备好后使用在后台获得的结果
一种方法是调用-在后台调用的方法末尾使用:
:您定义
-(void)calculate:(NSString*)input
{
.... do the calculation ...
[self performSelectorOnMainThread:@selector(use:) withObject:result];
}
然后你只需从主线程调用
[self performSelectorInBackground:@selector(calculate:) withObject:expression];
这样,您就可以在不阻塞主线程的情况下实现所需的功能
顺便说一下,-performSelectorInBackgronud
与NSOperationQueue
无关。因此,[queue waituntillallooperations definished]
不会等待执行由-performSelectorInBackground
调用的方法。
在任何情况下,除非绝对必要,否则不要在所有操作完成之前调用等待
要知道NSOperation
何时完成,您需要KVC属性isFinished
。请参阅。Yuji的正确答案将阻止用户界面冻结
然而,如果您真的希望主线程阻塞,那么将计算转移到另一个线程是毫无意义的。只需在主线程上执行即可。i、 e
result = [self calculate: expression];
这保证会“阻塞”当前线程,直到完成为止。如果在主线程上执行,它将“阻止”主线程。Yuji的正确答案将阻止用户界面冻结
然而,如果您真的希望主线程阻塞,那么将计算转移到另一个线程是毫无意义的。只需在主线程上执行即可。i、 e
result = [self calculate: expression];
这保证会“阻塞”当前线程,直到完成为止。如果在主线程上执行,它将“阻止”主线程。在主线程中执行(因为这可能需要时间-这是关于联网的)会阻止我显示微调器。因为它只有在计算结果后才会显示。在主线程中执行它(因为它可能需要时间-这是关于联网的)会阻止我显示微调器。因为它只有在计算结果后才会显示。我按照你说的方式做了,但是在“计算”和“使用”之后,它没有回到原来的位置。calculate的调用是从一个方法内部进行的,该方法作为该viewcontroller所遵循的协议的一部分实现。问题是,在执行use之后,这个方法不再工作了:因此“它没有回到原来的位置”。当然,它也不会回来,因为calculate:
在不同的线程上运行。你需要重新设计你的代码,这样它就不会回到原来的地方。这是后台处理的固有特性,你无法与之抗争。我按照你说的方式做了,但在“计算”和“使用”之后,它没有回到原来的位置。calculate的调用是从一个方法内部进行的,该方法作为该viewcontroller所遵循的协议的一部分实现。问题是,在执行use之后,这个方法不再工作了:因此“它没有回到原来的位置”。当然,它也不会回来,因为calculate:
在不同的线程上运行。你需要重新设计你的代码,这样它就不会回到原来的地方。这是后台处理的固有特性,你无法与之抗衡。