설명서를 읽고 타이머 (dispatch_source_t)가 이전 반복에 대해 처리기가 계속 진행중인 경우 실행되지 않는다는 사실을 알게되었습니다.dispatch_source_t 핸들러 함수의 타이밍 문제 - 디스패치 타이머에 적합한 패턴을 따르고 있습니까?
그러나이 처리기를 오래 사용하면이 작업이 부정확 해집니다. 그리고 나는 의도 한 시간에 타이머를 멈출 수 없다는 것을 관찰하고 있습니다.
내 코드는 다음과 같습니다
double secondsToFire = 1.0f;
dispatch_queue_t queue = dispatch_get_main_queue();
m_myTimer = CreateDispatchTimer(secondsToFire, queue,
^{
//Do some time consuming operation, taking any number of seconds
int retVal = DoSomeOperation();
if (retVal == 1)
{
cancelTimer(m_myTimer);
SomeOtherOperation();
}
});
dispatch_source_t CreateDispatchTimer(double interval, dispatch_queue_t queue, dispatch_block_t block)
{
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
if (timer)
{
// dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), interval * NSEC_PER_SEC, (1ull * NSEC_PER_SEC)/10);
dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, 0), interval * NSEC_PER_SEC, 0);
dispatch_source_set_event_handler(timer, block);
dispatch_resume(timer);
}
return timer;
}
void cancelTimer(dispatch_source_t _timer)
{
if (_timer)
{
dispatch_source_cancel(_timer);
_timer = nil;
}
}
참고 :
DoSomeOperation()
내부, 내가 코드 내가 다른 개인 큐에 의해 기록되는 배열에 액세스하는 @synchronized(array)
, 동봉 있습니다. 그러나 전체 DoSomeOperation()
은 메인 큐에서 실행됩니다.
제 질문은 올바른 타이밍 모델입니까? 타이머가 1 초마다 작동하지 않으며 너무 의도적으로 멈추지 않습니다. 나는 retVal == 1
일 때 SomeOtherOperation()
이 호출되지만 타이머는 아직 완료되지 않았 음을 관찰 할 수 있습니다.
또 다른 참고 : 위의
m_myTimer
은 바르, 그리고 그 모든 차이를 만들 수 있다면 내 프로젝트는 ARC입니다.
반복되는 'NSTimer'를 사용하지 않는 이유가 있습니까? –
나는 정밀도를 더 원합니다. NSTimers는 GCD 소스에 비해 정확하지 않습니다. –