2010-12-12 78 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