2012-03-13 5 views
4

아래와 같이 GCD에서 메인 큐를 얻었고 내 애플 리케이션의 다른 클래스에서 다른 작업을 추가합니다.GCD 대기열에서 작업 목록을 가져 오는 방법은 무엇입니까?

dispatch_queue_t queue = dispatch_get_global_queue (
    DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

이제 GCD 기본 대기열에있는 내 작업의 수를 알고 싶습니다.

GCD 대기열에서 작업 목록을 가져 오는 방법이 있습니까?

감사합니다.

+0

GCD 태그는 "최대 공약수"로 예약되어 있습니다. 태그를 수정하기 위해 태그가 변경되었습니다. – paxdiablo

답변

4

정말 GCD의 패러다임이 아닙니다. 예를 들어 특정 작업 그룹을 추적하려는 경우,이 예에서와 같이 디스패치 그룹을 만들고이를 완료하면 알림을 받도록 등록 할 수 있습니다.

dispatch_group_t taskGroup = dispatch_group_create(); 
dispatch_queue_t queue = //Get whatever queue you want here 
dispatch_group_async(taskGroup, queue,^{ 
    [object doSomething]; 
}); 
dispatch_group_async(taskGroup, queue,^{ 
    [object doMoreStuff]; 
}); 
dispatch_group_async(taskGroup, queue,^{ 
    [object doEvenMoreStuff]; 
}); 
dispatch_group_notify(taskGroup, queue, ^{ 
    [object workDone]; 
}); 
dispatch_release(taskGroup); 
+0

디스패치 그룹을 내 앱에 적용 할 수 없습니다. 여러 클래스가 GCD 큐에 여러 작업을 추가하기 때문에. Dispatch 그룹은 클래스의 단일 인스턴스에만 적용되는 것처럼 보입니다. 내 상황은 전역 수준의 중앙 풀에서 여러 클래스의 작업을 모니터링하려고한다는 것입니다. – user403015

+0

dispatch_group_notify 블록에서 dispatch_release를 사용하지 말고 dispatch_group_release를 사용하면 안됩니까? – droussel

+1

대기열에 그룹이 남아 있기 때문에 추가를 완료 한 후에도 안전하게 해제 될 수 있습니다 (또는 끔찍한 실수를 저질렀고 응용 프로그램이 작동하지 않습니다 ^^;) – borrrden

2

일반적으로이 작업은 대기열보다는 발송 그룹을 사용하여 수행됩니다. dispatch_group_async()을 사용하여 그룹에 작업을 할당하거나 dispatch_group_enter()dispatch_group_leave()을 사용하여 그룹에서 수동으로 항목을 표시 할 수 있습니다. 그런 다음 그룹에 dispatch_group_notify() 또는 dispatch_group_wait()을 사용하여 항목이 있는지 확인할 수 있습니다.

+0

발송 그룹을 적용 할 수 없습니다 나의 앱들. 여러 클래스가 GCD 큐에 여러 작업을 추가하기 때문에. Dispatch 그룹은 클래스의 단일 인스턴스에만 적용되는 것처럼 보입니다. 내 상황은 전역 수준의 중앙 풀에서 여러 클래스의 작업을 모니터링하려고한다는 것입니다. – user403015

+2

그룹은 파견 시점에 추가됩니다. 그것은 수업과는 아무런 관련이 없습니다. 'dispatch_' 메소드를 직접 호출하는 것이 아니라'NSOperations'를 사용하고 있습니까? 'dispatch_' 메소드를 사용하고 있다면, 그 시점에 그룹을 적용 할 수 있습니다. –

+0

내 상황 : 클래스 A, 클래스 B 및 클래스 C는 자신의 인스턴스 내부에서 GCD에 작업을 추가합니다. 서로 다른 클래스의 공통 디스패치 그룹을 만들려면 어떻게해야합니까? 생성 된 그룹을 다른 클래스로 전달할 수 있습니까? 감사. – user403015

관련 문제