我阅读了文档,发现如果处理程序仍在进行之前的迭代,则定时器(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()
在主队列上执行。
我的问题是,这是正确和准确的时间模型?我在这里发帖是因为我面临着很多不准确的情况 - 计时器不会每秒都会触发,而且它也不会像预期的那样停止。我能够观察到SomeOtherOperation()
在retVal == 1
时被调用,但是定时器尚未完成。
另注:
m_myTimer
以上是伊娃,我的项目是ARC,如果能够有任何区别。
有没有原因你不使用重复'NSTimer'? – 2014-10-10 19:18:57
我想要更精确 - 与GCD源相比,NSTimers不是很准确。 – 2014-10-10 19:19:54