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不是一个真正的选择.我知道有调度计时器源,但它们似乎更像是用于解雇周期性任务.我不知道他们是否可以像我需要的那样轻松取消并开始.
谢谢你的任何建议.
dispatch_source_set_timer()将重新调度一个调度计时器源(如果您将DISPATCH_TIME_FOREVER作为interval参数传递,则可以是一次性和非重复的).
请注意,此API是非抢占式的,即除非您从计时器源的目标队列调用dispatch_source_set_timer(),否则计时器处理程序可能已在重新计划时运行.
但是,一旦dispatch_source_set_timer()返回,就可以保证计时器不再以先前设置的目标时间触发.
| 归档时间: |
|
| 查看次数: |
1363 次 |
| 最近记录: |