2011-01-21 3 views
4

생성 대기 시간이 45 초가 걸리는 구성의 글로벌 대기열에 타이머를 만들지 만 어떤 이유로 든 작동하지 않는 것 같습니다. 그것을 지금 발사하기 위하여 바꾸는 것은 또한 아무것도하지 않는다.DISPATCH_SOURCE_TYPE_TIMER이 (가) 실행되지 않음

나머지 앱에는 많은 일이 일어나기 때문에 타이머가 사전 실행 중임을 알 수 있습니다.

이 타이머가 생성하는 방법입니다

dispatch_queue_t globalQueue = 
     dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); 

timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, globalQueue); 
if (timer) { 

// start 45 seconds for now 
dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 45ull * NSEC_PER_SEC); 
uint64_t interval = 15ull * NSEC_PER_SEC; // every 15 seconds, converted to nanosecs 

// leeway:8 microseconds 
dispatch_source_set_timer(timer, startTime, interval, 8000ull); 

dispatch_source_set_event_handler(timer, block); // block is passed in 

dispatch_resume(timer); 

1)가 발사하지 왜 디버깅하려고하는 좋은 방법이 무엇/알아? 그렇지 않은 경우

2) 특정 시점의 대기열에서 실행되도록 예약 된 모든 주어진 작업을 나열하는 방법이 있습니까?

일부 작업은 시뮬레이터에서 실행할 수 없으므로 테스트 장치 자체에서 디버깅해야합니다.

+0

우선 순위를 DISPATCH_QUEUE_PRIORITY_NORMAL (으)로 변경하면 궁금합니다. 또한, 그 블록이 NULL이 아닌지 확인하고 있다고 가정합니다. –

+0

수정 - 블록이 NULL이 아니며 타이머가 실행되는 유일한 시간은 DISPATCH_QUEUE_PRIORITY_HIGH로 구성되었을 때입니다.이 타이머는 실행될 수 없습니다. 그래서 우선 순위가 낮은 대기열에서 차단되는 것을 알아내는 데 도움이되는 도구가 있는지 또는 모든 코드를 추적해야 하는지를 파악하려고합니다. –

+0

낮은 우선 순위로 실행되도록 구성 할 수있는 항목 수에는 제한이 있습니까? –

답변

1

상수는 부호없는 long long이 아닌 unsigned long이어야합니다. 다음으로 변경하십시오.

dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 45ull * NSEC_PER_SEC); 
uint64_t interval = 15ull * NSEC_PER_SEC; // every 15 seconds, converted to nanosecs 
+0

죄송합니다 - 오타되었습니다. 실제 코드에서는 ull입니다. –

2

비슷한 문제가 있습니다. 내 짐작은 귀하의 타이머가 지역 변수이며 설정 한 직후에 출시된다는 것입니다. 당신은 그것을 클래스 속성으로 만들 수 있습니다.
보십시오 here.

관련 문제