1

저는 앱 부팅 속도를 높이려고합니다. 그 중 하나는 비동기 디스패치 대기열을 사용하는 것이 었습니다. 나는 시작할 때 서로 옆에 두 개의 작업을 실행할 수있다. 그러나 둘 다 주요 스레드 (주로 UI 코드)에서 실행되는 중요한 부분을 가지고 있습니다. 메인 스레드에서 다중 GCD 디스패치

dispatch_async(dispatch_get_main_queue, ^{ 
    [self doTask1]; 
}); 

dispatch_async(dispatch_get_main_queue, ^{ 
    [self doTask2]; 
    //Will task 2 take turns with task 1, or will task 2 start after 1 is finished? 
}); 

내 질문

이있다 :이 예에서와 같이 부팅시 2 dispatch_async 년대를 호출 할 경우, 다음 2 블록들이 실행에 번갈아 가며 것, 또는 전체 첫 번째 블록이 먼저 실행됩니다?

답변

6

주요 큐 직렬 큐입니다. 직렬 큐에 추가 된 블록은 추가 된 순서대로 실행되며 한 번에 하나씩 (순차적으로) 실행됩니다. 귀하의 예제에서 task2는 task1이 완료 될 때까지 시작되지 않습니다.

동시에 실행하려면 글로벌 동시 대기열 중 하나에 전달해야합니다.

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(q, ^{/* this work may finish before other work added to this queue later */}); 
+0

직렬 대기열이라면 왜 비동기 전달을 호출 할 수 있습니까? –

+1

귀하의 질문을 이해할 수 없으므로 왜 그럴 수 없습니까? async는 단지 블록을 대기열에 넣고 싶지만 지금 당장 결과를 필요로하지 않거나 대기열에 추가 한 현재 작업을 차단하려고한다는 것을 의미합니다. 다른 스레드에서 발생하거나 즉시 시작될 필요가 없습니다. –

+3

"비동기"와 "동시"가 동의어라는 일반적인 오해가있는 것 같습니다. 나는 그것이 어디서 왔는지는 모르겠지만, 스택 오버 플로우 (overflow) 전체에서 그것을 볼 수있다. –

-2

하나는 다른 하나 다음에 실행되지만 동시에 실행되므로 task1이 완료되기 전에 task2를 실행할 수 있습니다.

확인 대체 :

dispatch_async(dispatch_get_main_queue, ^{ 
    [self doTask1]; 
    dispatch_async(dispatch_get_main_queue, ^{ 
     [self doTask2]; 
     //Now task2 will execute after task1 
    }); 
}); 
+0

그래서 다른 방법으로도 순서대로 실행되며, 예를 들어 task2가 task1 전에 완료되도록 할 수 있습니까? 참고 : 나는 마지막 행동을 찾고있다. –

+0

예, 나의 대안은 다른 작업 후에 하나의 작업이 시작된다는 것을 보장합니다. – fbernardo

+3

메인 대기열은 동시에 작업을 수행하지 않습니다. –

관련 문제