2013-01-11 51 views
2

我有一些代碼使用相當數量的GCD代碼。我需要實施某種方式來安排一段時間的工作單位,但可以取消並在需要時進一步移出。是否有GCD等同於設置定時器,以後可以取消並重新安排定時器?

想象點擊處理程序;有些東西可以區分單擊和雙擊。要做到這一點,人們會得到點擊事件,並設置一個短計時器來處理它。如果在定時器啓動之前另一個點擊事件發生,它將被取消並重新啓動。當計時器最終啓動時,它將具有正確的點擊次數。

總而言之,使用NSTimers或NSObject上的performSelector可以很容易地實現。也許像

NSUInteger tapCount = 0; 

- (void)handleClickEvent 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(fireEvent:) object:nil]; 
    tapCount++; 
    [self performSelector:@selector(fireEvent:) withObject:@(tapCount) afterDelay:2.0]; 
} 

- (void)fireEvent:(NSNumber *)clickCount 
{ 
    // Act on the coalesced event 
    NSUInteger numClicks = [clickCount unsignedIntegerValue]; 
    if (numClicks == 1) // single click 
    if (numClicks == 2) // double click 
} 

之前這樣做不過它,我想知道是否有一種方法與GCD函數來做到這一點。我知道你不能撤銷隊列的排隊,所以dispatch_after並不是真正的選擇。我知道有派遣計時器的來源,但他們似乎更多地用於發射週期性任務。我不知道他們是否可以輕鬆取消,並稍後開始像我所需要的。

感謝您的任何建議。

+0

這可能是一個cop-out,但處理這個(和複雜的依賴關係)的通常方式是在抽象階梯中進一步提升,並使用'NSOperation',它顯然在下面使用GCD。 – borrrden

+0

有一個示例可以在這裏修改:http://www.fieryrobot.com/blog/2010/07/10/a-watchdog-timer-in-gcd/您不能排隊,但可以儘早完成從塊內檢查全局標誌。 – Jano

+0

謝謝@Jano,那就是我正在尋找的答案。 Mike Ash也有類似的博客文章。這些回答了我的問題。 http://www.mikeash.com/pyblog/friday-qa-2010-07-02-background-timers.html –

回答

7

dispatch_source_set_timer()將重新計劃調度計時器源(如果傳遞DISPATCH_TIME_FOREVER作爲interval參數,它可以是一次性的且不重複的)。

請注意,此API是非搶先式的,即,除非您從定時器源的目標隊列中調用dispatch_source_set_timer(),否則定時器處理程序可能在重新計劃時已經運行。

但是,一旦dispatch_source_set_timer()返回,就保證定時器不會再在先前設定的目標時間觸發。

相關問題