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:
在不同的线程上运行。你需要重新设计你的代码,这样它就不会回到原来的地方。这是后台处理的固有特性,你无法与之抗衡。