GCD是否等同于设置可以在以后取消和重新安排的计时器?

D.C*_*.C. 2 macos cocoa objective-c grand-central-dispatch ios

我有一些使用相当数量的GCD代码的代码.我需要在延迟一段时间后实施一种安排工作单元的方法,但如果需要可以取消并进一步移出.

想想点击的处理程序; 用于区分单击和双击的内容.为此,可以获得click事件,并设置一个短计时器来对其进行操作.如果在计时器触发之前发生了另一次点击事件,它将被取消并再次启动.当计时器最终启动时,它将具有正确的点击次数.

无论如何,这很容易在NSObject上使用NSTimers或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
}
Run Code Online (Sandbox Code Playgroud)

然而,在这样做之前,我想知道是否有办法用GCD功能做到这一点.我知道你无法撤消排队一个块,所以dispatch_after不是一个真正的选择.我知道有调度计时器源,但它们似乎更像是用于解雇周期性任务.我不知道他们是否可以像我需要的那样轻松取消并开始.

谢谢你的任何建议.

das*_*das 7

dispatch_source_set_timer()将重新调度一个调度计时器源(如果您将DISPATCH_TIME_FOREVER作为interval参数传递,则可以是一次性和非重复的).

请注意,此API是非抢占式的,即除非您从计时器源的目标队列调用dispatch_source_set_timer(),否则计时器处理程序可能已在重新计划时运行.

但是,一旦dispatch_source_set_timer()返回,就可以保证计时器不再以先前设置的目标时间触发.