2011-12-08 1 views
1

다음은 하나의 메인 그룹을 실행하고 기다린 다음 별도의 스레드에서 두 개의 다른 백그라운드 작업을 실행하고 대기 한 다음 아래에 표시된 일반 블록에서 변경된 값을 반환하는 샘플 함수입니다. 아래에 표시된 것은 이것을 수행하는 방법에 대한 나의 추측입니다. 이 블록을 모두 한 블록으로 실행하면 작동합니다. 블록을 분리하면 실패합니다. 누구든지 비슷한 것을 성취하는 방법에 대한 모범이 있습니까? 귀하의 도움에 미리 감사드립니다.그랜드 센트럴 파견. 하나의 비동기 그룹을 실행하고 대기 한 다음 다른 그룹을 실행하고 다시 대기 한 다음 완료하는 방법

-(NSString *)sampleFunction:(NSString*)inputString 
{ 
__block NSString *returnString; 

dispatch_group_t mainGroup = dispatch_group_create(); 
dispatch_group_t otherGroup = dispatch_group_create(); 

void (^firstBlock)(void) = ^(void) 
{ 
    ... 
}; 

void (^secondBlock)(void) = ^(void) 
{ 
    ... 
}; 


void (^thirdBlock)(void) = ^(void) 
{ 
    ... 
}; 

dispatch_group_async(oneGroup, dispatch_get_global_queue(0, 0), firstBlock); 

dispatch_group_wait(oneGroup, sizeof(int)); 

dispatch_group_async(otherGroup, dispatch_get_global_queue(0, 0), secondBlock); 
dispatch_group_async(otherGroup, dispatch_get_global_queue(0, 0), thirdBlock); 

dispatch_group_wait(otherGroup, sizeof(int)); 

dispatch_release(userGroup); 
dispatch_release(otherGroup); 

return returnString; 
} 
+1

큰 그림을 설명해주십시오. 무엇을 성취하려고합니까? 나는 기다리는 부분을 얻지 못한다. – DarkDust

+1

그리고 왜'sizeof (int)'를'dispatch_group_wait'에 인자로 넘겨 줍니까? 당신은'DISPATCH_TIME_FOREVER'을 알고 있습니까? – DarkDust

+1

한 스레드에서 모든 코드를 실행하지 않는 이유는 무엇입니까? 쓰레드가 끝나기를 기다리고 있다면, 쓰레드를 갖는 것이 무엇이겠습니까? –

답변

4

이렇게하는 데는 여러 가지 방법이 있지만 가장 개념적으로 단순한 (또는 적어도 명백한) 방법은 "파이프 라인"의 각 단계에 대한 그룹을 만든 다음 그룹 A 일정에 대한 완료 콜백을하는 것입니다 그룹 B의 작업도 그룹 C의 작업을 예약하는 완료 콜백을 가지고 있습니다.

여기에있는 키는 그룹이 완료 될 때까지 실제로 "대기"하지 않습니다. 그룹은 해당 그룹의 마지막 블록이 완료 될 때 자동으로 실행되는 완료 블록을 가질 수 있습니다 (dispatch_group_notify() 참조). 이는 "팬 인"포인트를 만드는 좋은 방법입니다. 그룹.

7

dispatch_semaphore는 여기에 친구입니다. 당신은 더 간단한 솔루션을 원하는 경우에 당신이 당신의 그룹을 사용하고 정확히 확인되지는 않았지만 :-)

/* Create your semaphore with 0 */ 
dispatch_semaphore_t sema = dispatch_semaphore_create(0); 

/* wait on the semaphore, causes your second & third queue to wait */ 
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 

/* At the end of your first queue finishing, signal the semaphore waiting in 
    the 2nd queue to take over */ 
dispatch_semaphore_signal(sema); 

, 그냥,이 그룹 대신 (당신을 위해 세마포어 작업을 수행) dispatch_apply 사용합니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 나는 이것을 곧 다시 시도 할 것이고 당신과 함께 투표를하고 올바른 대답을 할 때 나는 성공을 만난다. – banDedo

관련 문제