我有一些代码使用了相当数量的GCD代码。我需要实现一种方法来安排工作单位后,一些延迟,但可以取消和进一步移动,如果需要。
考虑点击的处理程序;区分单次点击和两次点击的东西。要做到这一点,我们需要获得单击事件,并设置一个短定时器来对其进行操作。如果在计时器触发之前出现另一个点击事件,则将取消并重新启动。当计时器最终触发时,它将拥有正确的点击次数。
无论如何,用nstimer或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不是一个真正的选项。我知道有调度定时器源,但它们似乎更多地用于触发周期性任务。我不知道它们是否能像我需要的那样被轻易取消并推迟开始。
谢谢你的建议
dispatch_source_set_timer()将重新调度调度计时器源(如果您将DISPATCH_TIME_FOREVER作为间隔参数,则该源可以是一次性且不重复的)。
注意,这个API是非抢占式的,也就是说,除非你从计时器源的目标队列调用dispatch_source_set_timer(),否则计时器处理程序在重新调度时可能已经在运行。
但是,一旦dispatch_source_set_timer()返回,可以保证计时器将不再在先前设置的目标时间触发。