1

我已经使用我首先在 TouchesBegan 重载中设置的 NSTimer 实现了一个长按处理程序。

但是,我真正想要的是在按住触摸的同时连续快速执行一个动作。因此,在计时器到期时,我调用一个处理程序来完成这项工作,然后它设置另一个计时器并继续循环,直到 TouchesEnded 进入并取消它,或者满足另一个终止条件。

这工作正常,直到我的处理程序代码触发动画同时消失。现在我们有了动画事件和计时器事件,我们还需要处理 TouchesEnded。

我发现,如果触发了动画,并且我将计时器设置为小于 0.025 秒,我的 TouchesEnded 事件直到计时器周期停止(另一个终止条件)才会发生。设置一个较慢的计时器,或者不触发动画,让它工作(TouchedEnded 立即出现),但不是我想要的。

显然,这一切都在设备上(发布版本 - 没有 NSLogs) - 在 sim 中一切正常

有没有办法设置这些事件的相对优先级 - 或者我可能在这里遗漏了其他明显的东西?

[更新]

在这种情况下,我通过在没有视觉反馈的情况下完成连续部分来解决这个问题(从这个用户的角度来看是即时的)。我认为目前还可以。我仍然希望听到更多关于此的想法(Jeffrey 的想法很好),但我现在不会坐立不安。

4

1 回答 1

1

尝试通过生成线程来编写您自己的 Timer 类型的类。例子:

BOOL continue = YES; //outside of your @implementation

-(void)doLoop
{
   while(continue){
      [NSThread sleepForTimeInterval:.025];
      [self performSelectorOnMainThread:@selector(whateverTheFunctionIs) waitUntilDone:YES];
    }
}

这将由[NSThread detatchNewThreadSelector:@selector(doLoop) toTarget:self withObject:nil]. 这并不完全是线程安全的,但是您可以选择将布尔值包装到 NSNumber 中,然后在您选择时对其执行 @synchronize 。或者,在我写完那个小片段后,我意识到最好检查当前的 NSTime 而不是 sleepForTimeInterval: 但你明白了。:)

于 2008-10-31T21:32:57.167 回答