2008-10-30 67 views
1

我使用,我第一次在超负荷的touchesBegan设置一个NSTimer实现自来水和保持处理。定时器和动画事件胜过TouchesEnded事件

不过,我真正想要的是要在正在举行的触摸来连续快速连续火执行的操作。所以,在定时器到期时,我调用一个处理程序来完成工作,然后设置另一个定时器,循环继续,直到TouchesEnded进入并取消它,或者满足另一个终止条件。

这工作得很好,直到我的处理程序代码触发动画在同一时间熄灭。 现在我们有动画事件和计时器事件,以及我们需要处理TouchesEnded的所有事情。

我在找的是,如果动画被触发,并且我的计时器设置小于0.025秒,我的TouchesEnded事件不会通过,直到定时器周期停止(另一个终止条件)。设置一个较慢的定时器,或不触发动画,使其工作(TouchedEnded马上就来),但不是我想要的。

显然,这是所有的设备上(发布版本 - 无NSLogs) - 在SIM一切工作正常

有没有设置这些事件的相对先决任何方式 - 或者是它可能我在这里丢失了其他的东西?

 
[Update] 

我,直到它完成(从这个角度看用户是瞬发)无视觉反馈做连续部分围绕这个工作在这种情况下。我认为现在可以。我仍然想听到更多的想法(杰弗里的想法很好),但我现在没有等待提心吊胆。

+0

感谢您调整标签,克里斯 - 这可能有助于让更多的人看到这个问题。 – philsquared 2008-10-31 16:20:22

回答

1

尝试通过产卵关到一个线程编写自己的定时器型类。例如:

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:但是你明白了。 :)

+0

谢谢Jeffrey。我不确定这是否是我正在寻找的答案,但它肯定是值得尝试的东西,我可以通过这种方式控制优先级 - 尽管对于动画来说仍然不是这样。暂时保持这种状态 - 但感谢您的答复(并投票支持)。 – philsquared 2008-11-01 15:54:11