2010-12-12 79 views
3

从背景中运行的方法调用performSelectorInBackground:...的真正效果是什么?我希望它异步运行调用performSelectorInBackground:从后台线程

例如:

- (void) _imageBufferWasUpdated{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    //do something here 

    if(shouldContinue){ 
     [self performSelectorInBackground:@selector(_loop) withObject:nil]; 
    } 
    [pool release]; 
} 

_imageBufferWasUpdated会在后台运行,我想异步调用_loop方法(在后台也是如此_imageBufferWasUpdated即将结束,_loop结束大概前) 。

这是正确的吗?

是否有更高效(并且相对简单)的方法来使用GCD来做到这一点?如果你能举一些例子说明如何使用GCD进行分析,我将不胜感激。我认为我需要至少3个线程,主线程,运行_imageBufferWasUpdated的后台线程和_loop的其他后台线程。我对么?

在此先感谢 伊格纳西奥

+0

请有人帮助我! ;)在后台线程进程非常缓慢,我不知道这是否是原因... – nacho4d 2010-12-12 17:19:03

回答

2

你在做什么对我来说似乎很好。可可可能使用单个后台线程,所以它不应该导致过多的线程创建。

如果你想要更多的控制,你可以使用NSOperation或GCD。两者都很简单。例如,GCD会是这样的

#import <dispatch/dispatch.h> 

... 

dispatch_async(dispatch_get_global_queue(0,0), ^{ 
    [self _loop]; 
}]; 
+0

它不能使用单个后台线程;这样做很快就会导致僵局。 – bbum 2010-12-12 20:31:54

+0

我认为这并不是我想要的,因为使用dispatch_get_global_queue会使_loop在主线程中运行,并且该循环与其他东西非常忙碌。难道它不像performSelectorOnMainThread:...而不是performSelectorOnBackgroundThread? – nacho4d 2010-12-13 03:02:49

+0

默认全局队列不在主线程上运行。你要求主队伍这样做。默认队列在后台线程上运行。 – 2010-12-13 07:09:55

1

performSelectorInBackground叉你选择一个后台线程。 [documentation]

我不知道我是否正确,但是您应该使用GCD或其高级类(NSOperationQueue)来做所有事情。如果系统中存在太多线程并且计算资源不足,分叉过多的后台线程可能会导致性能下降

GCD根据可用的系统资源自动管理多少个线程同时运行。

+0

谢谢杰里米,我会尝试GCD;) – nacho4d 2010-12-14 02:26:56