我有一些代碼使用相當數量的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並不是真正的選擇。我知道有派遣計時器的來源,但他們似乎更多地用於發射週期性任務。我不知道他們是否可以輕鬆取消,並稍後開始像我所需要的。
感謝您的任何建議。
這可能是一個cop-out,但處理這個(和複雜的依賴關係)的通常方式是在抽象階梯中進一步提升,並使用'NSOperation',它顯然在下面使用GCD。 – borrrden
有一個示例可以在這裏修改:http://www.fieryrobot.com/blog/2010/07/10/a-watchdog-timer-in-gcd/您不能排隊,但可以儘早完成從塊內檢查全局標誌。 – Jano
謝謝@Jano,那就是我正在尋找的答案。 Mike Ash也有類似的博客文章。這些回答了我的問題。 http://www.mikeash.com/pyblog/friday-qa-2010-07-02-background-timers.html –