2011-08-26 5 views
2

iOS에서 GCD를 사용하여 백그라운드 스레드에서 시간이 많이 걸리는 작업을 수행하고 있습니다. API에는 두 개의 블록을 인수로 취하는 start 메소드가 있으며 둘 다 기본 대기열에서 호출됩니다. 첫 번째 작업은 작업이 시작될 때 호출되고 두 번째 작업은 작업이 완료 될 때 호출됩니다. 이것은 모두 작동합니다.GCD를 사용하여 비동기 백그라운드 작업을 어떻게 시퀀스 할 수 있습니까?

실제로 이러한 시간 소모적 인 작업을 여러 번 수행해야합니다. API를 사용하면 동시에 모든 것을 시작한 다음 각 블록이 완료 될 때까지 기다렸다가 블록을 통해 UI를 업데이트 할 수 있습니다. 동시에 실행됩니다.

그러나 실제로 내가하고 싶은 것은 시간이 많이 소요되는 작업 (아직 설명 된 API를 사용하여 시작하는 작업)을 순서대로 배열하여 동시에 모든 작업을 시작할 수 있고 첫 번째 작업을 실행하고 콜백 (call-backs)을하고, 두 번째 콜을 돌리고 콜백 (call-backs)을 준다.

GCD 및 블록을 사용하여이를 수행하는 가장 좋은 방법은 무엇입니까?

작업이 동기식 인 경우, 차례대로 실행되는 루프 만 있으면 모든 작업을 비동기 적으로 실행할 수 있습니다. 하지만 콜백이있어서 작동하지 않습니다. 나는 일련의 이벤트를 시작한 후에이 모든 것을 발생시키는 객체가 사라질 수 있기 때문에 체인을 연결하지 않는 것을 선호합니다.

+0

명확히하려면 : 직렬 대기열을 추가하면 API의 다른 쪽이이를 해결합니다. 핵심 질문은 현재 API와 비동기 동시 동작에서 동일한 작업을 수행하는 방법입니다. –

답변

1

dispatch_queue_create을 사용하여 FIFO 순서대로 실행할 고유 한 대기열을 만들 수 있습니다. 직렬 큐임을 지정하지 않아도됩니다. 기본적으로이 방법으로 작동합니다.

샘플 대기열 작성 :이 큐를 소유

dispatch_queue_t my_q = dispatch_queue_create("Serial",NULL); 

, 그래서 (dispatch_release 포함)를 해제 실패가 누출됩니다.

자세한 내용은 Apple's docs here입니다.

+0

실용적인 솔루션은 설명대로 : API 아래에 동시 대기열을 대상으로하는 사용자 지정 대기열을 만듭니다 (작동했지만 시도했습니다). 그러나 그것은 묻는 질문이 아닙니다. 이 질문은 사용 가능한 비동기 API 만 사용해야합니다. –

0

GCD를 사용해야하는 특별한 이유가 있습니까? 동시성이 1 인 NSOperationQueue와 같은 소리가 원하는 것입니다.

+0

NSOperationQueue는 높은 수준이지만 가변성있는 값 캡처가없는 가장 큰 장애물입니다. 또한 GCD를 사용하면 예를 들어 대리인 관계를 없애고 API를 다시 디자인 할 수 있습니다. –

관련 문제