我有一些使用大量 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 并不是一个真正的选择。我知道有调度计时器源,但它们似乎更用于触发定期任务。我不知道它们是否可以像我需要的那样轻松取消并稍后开始。
感谢您的任何建议。