我閱讀了文檔,發現如果處理程序仍在進行之前的迭代,則定時器(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