2012-02-15 3 views
2

async가 기본 스레드와 별도의 스레드에서 실행되므로 웹 서비스에 대한 비동기 연결을 정의한다고 가정합니다.iPhone - 시리얼 디스패치 대기열에 비동기 작업을 보내는 GCD

이제이 작업이나 코드 블록을 직렬 디스패치 대기열에 넣을 수 있습니다. 직렬 디스패치 대기열은 한 번에 두 개 이상의 작업을 처리하지 않지만 이미 비동기식 작업을 보내고 있으므로 비동기 작업 호출이 완료된 후 작업이 완료된 것으로 간주됩니까? 또는 실제로 비동기 작업이 다음 작업을 처리하기 전에 완료 될 때까지 기다릴 것입니까?

동시에 생성되는 스레드는 비동기 작업을 처리 할 다른 스레드를 생성합니까?

편집 : 내 질문은 그래서 나는, 내 질문에 정말 명확하지 않다 실현 :

나는 동일한 일련 파견 큐를 사용하고, 그리고 난 이미 대한 비동기 작업을 수행하는 코드 블록을 dispatch_async 사용하여 발송하는 경우

예를 들어, NSURLConnection - initWithRequest : delegate : async를 실행하면 비동기 호출 이후에 직렬 큐에 의해 블록이 완료된 것으로 간주 될 것인가? 비동기 호출이 또 다른 스레드를 생성 할 것인가? 또는 대기열은 여전히 ​​두 번째 작업을 처리하기 전에 이미 비동기 인 작업 1을 기다릴 것입니까?

+0

* 동일한 대기열 *로 발송 하시겠습니까? – DarkDust

+0

같은 대기열을 사용하는 @DarkDust 예. –

답변

3

직렬 대기열에 디스패치하면 각 디스패치 된 블록이 차례로 처리됩니다. 따라서 첫 번째 블록이 처리하는 데 오랜 시간이 걸리면 두 번째 블록은 장기 실행 첫 번째 블록이 완료 될 때까지 호출되지 않습니다.

dispatch_async으로 대기열에 추가하는 경우 새 블록을 대기열의 끝에두면 기능 dispatch_async이 즉시 반환되며 계속 진행할 수 있습니다. 그러나 블록은 이전 블록이 완료 될 때까지 실행되지 않습니다.

그러나 dispatch_sync은 블록이 실행되고 끝날 때까지 대기합니다. 그래서 귀하의 경우, dispatch_sync은 장기 실행 첫 번째 블록이 완료 될 때까지 차단됩니다.

동시 대기열로 보내면 두 번째 블록이 새 스레드에서 실행되어 첫 번째 블록이 두 번째 블록이 실행되는 것을 막지 못합니다.

두 개의 대기열을 만들어 다른 작업에 사용할 수도 있습니다. 예를 들어 웹 서비스에만 하나의 대기열을, 다른 작업에 다른 대기열을 사용할 수 있습니다. 이러한 작업이 서로 관련되는 방법과 병렬로 실행될 수 있으며 차례로 실행해야하는 작업에 따라 다릅니다.

+0

답변 해 주셔서 감사합니다. DarkDust, 제 질문이 명확하지 않다는 것을 알고 있습니다. 그래서 혼란에 빠져서 대답을 편집했습니다. 첫 번째 불명확 한 질문과 관련이 있기 때문에 나는 답을 upvoted. –

+0

* 큐 *는 첫 번째 블록을 중단하지 않으므로 첫 번째 블록은 완료된 것으로 간주되지 않습니다. 첫 번째 블록은 여전히 ​​실행중인 것으로 간주되며 두 번째 블록은 대기열에 포함 된 것으로 간주됩니다. 따라서 대기열은 첫 번째 블록이 완료 될 때까지 기다렸다가 두 번째 블록을 실행하기 시작합니다. 그러나 실제 함수 호출 인'dispatch_async'는 즉시 리턴 될 것입니다 (그것은'_async'의 포인트입니다). – DarkDust

+0

감사합니다. –

관련 문제