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를 사용하여 이것을 포크하는 방법에 대한 몇 가지 예를 들려 주시면 감사하겠습니다. _imageBufferWasUpdated 및 _loop에 대한 다른 백그라운드 스레드를 실행하기위한 최소 3 개의 스레드, 기본 스레드, 백그라운드 스레드가 필요하다고 생각합니다. 나 맞아? 백그라운드 스레드에 사전에

덕분에 이그나시오

+0

제발 도와주세요! ;) 백그라운드 스레드에서 프로세스가 매우 느리고 이것이 이유인지 모른다 ... – nacho4d

답변

2

내가하고있는 일은 나에게 좋을 것 같습니다. 코코아는 아마도 단일 배경 스레드를 사용하기 때문에 과도한 스레드 생성으로 이어지지 않아야합니다.

더 많은 제어가 필요하면 NSOperation 또는 GCD를 사용할 수 있습니다. 둘 다 아주 간단합니다. 예, GCD는 다음과 같습니다.

#import <dispatch/dispatch.h> 

... 

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

단일 배경 스레드를 사용할 수 없다. 그렇게하면 신속하게 교착 상태가 발생합니다. – bbum

+0

dispatch_get_global_queue를 사용하면 주 스레드에서 _loop이 실행되고 그 루프는 다른 작업들로 인해 매우 바쁘기 때문에 이것이 내가 원하는 것만은 아니라고 생각합니다. performSelectorOnMainThread와 같은 것이 아니겠습니까? ... performSelectorOnBackgroundThread보다는 오히려? – nacho4d

+0

기본 글로벌 큐는 주 스레드에서 실행되지 않습니다. 메인 큐가이를 수행하도록 요청합니다. 기본 대기열은 백그라운드 스레드에서 실행됩니다. –

1

performSelectorInBackground 포크 당신의 선택. [documentation]

내가 맞는지 모르겠지만 GCD 또는 상위 수준 클래스 (NSOperationQueue)를 사용하여 모든 작업을 수행해야합니다. 시스템이 너무 많은 스레드로 포화되어 있고 컴퓨팅 리소스가 충분하지 않은 경우 성능이 저하 될 수 있습니다.

GCD는 사용 가능한 시스템 리소스에 따라 동시에 작동하는 스레드 수를 자동으로 관리합니다.

+0

감사합니다 Jeremy, 나는 GCD를 시도 할 것이다;) – nacho4d

관련 문제