2010-11-11 117 views
18

我有以下代码:如何更改NSTimer的时间?

timer = [[NSTimer scheduledTimerWithTimeInterval:0.50 target:self selector:@selector(onTimer) userInfo:nil repeats:YES] retain];  

-(void) onTimer 
{ 
} 

每0.50秒的OnTimer方法被称为后。

但现在我想增加时间间隔。

这意味着:

OnTimer calls after 0.55 
OnTimer calls after 0.60 
OnTimer calls after 0.65 
OnTimer calls after 0.70 
OnTimer calls after 0.75 
& so on. 

对此有任何解决方案?我尝试了很多,但没有成功。

回答

21

当然,你可以做到这一点。将repeats:YES更改为repeats:NO以便定时器不重复,然后在onTimer中,只需启动一个间隔较长的新定时器。您需要一个变量来保存您的时间间隔,以便您可以通过onTimer每次更长一点。此外,你可能不需要保留计时器,因为它只会触发一次,当它发生时,你会得到一个新的计时器。

我没有Objective-C的专家(或iOS专家......),它已经有一段时间,但我认为是这样的:

float gap = 0.50; 

[NSTimer scheduledTimerWithTimeInterval:gap target:self selector:@selector(onTimer) userInfo:nil repeats:NO]; 

-(void) onTimer { 
    gap = gap + .05; 
    [NSTimer scheduledTimerWithTimeInterval:gap target:self selector:@selector(onTimer) userInfo:nil repeats:NO]; 
} 

类似的东西?哦,我真的不太确定这里的retain语义......阅读文档以确保你不会泄漏!

+0

谢谢,它现在工作正常。 – 2010-11-12 04:27:01

+0

定时器结束时,NSTimer对象将自动处理。 – qwertz 2013-05-29 19:36:07

4

你可以尝试调整计时器的FireDate,看到setFireDate

6

下面是使用的NSTimer的fireDate财产(写在斯威夫特)一个解决方案Hardik的问题:

var timeInterval = 0.50 
NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: Selector("onTimer:"), userInfo: nil, repeats: true) 

func onTimer(timer: NSTimer) { 
    timeInterval += 0.05 
    timer.fireDate = timer.fireDate.dateByAddingTimeInterval(timeInterval) 
} 
+0

你不能像这样重新启动计时器。 – holex 2014-07-16 09:25:31

+0

对我来说很有效。这里是代码: https://gist.github.com/anonymous/86005ed7049e985a34f6 而顺便说一句。计时器重复真实,我只是设置下一个火灾日期。 – 2014-07-16 09:28:02

+1

据我读了NSTimer使用setFireDate的文档是绝对好(https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/NSTimer_Class/Reference/NSTimer.html#// apple_ref/OCC/instm /的NSTimer/setFireDate :)。 – 2014-07-16 11:28:41

1

您不能更改时间间隔,以一个计时器火灾。没门。没有这样做的API。

两个明显的解决方法:如果你总是改变间隔,那么你可以改变下一次定时器触发;这比定时器间隔优先。当然,每当定时器启动时你都必须这样做。如果您有时更改间隔,只需使第一个计时器失效并使用新间隔创建一个新计时器。

0

这只是为我的魅力。

- (void)FlexibleTimer { 
    if (!keyTimer) { 
     keyTimer = [NSTimer scheduledTimerWithTimeInterval:self.intervalOfIdleTimer 
                 target:self 
                selector:@selector(keyTimerExceeded) 
                userInfo:nil 
                repeats:YES]; 
    } 
    else { 
     if (fabs([keyTimer.fireDate timeIntervalSinceNow]) < self.intervalOfIdleTimer - 1.0) { 
      [keyTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:self.intervalOfIdleTimer]]; 
     } 
    } 
} 

- (void)keyTimerExceeded { 
    [self setNextDelayForFlexibleTimer]; 
    [self FlexibleTimer]; 
    NSLog(@"Timer Exceeded %f", [[NSDate date] timeIntervalSince1970]); 
}