如何更改NSTimer的时间?

时间:2010-11-11 07:06:28

标签: ios objective-c 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.

有没有解决方案?我已经尝试了很多,但它不起作用。

5 个答案:

答案 0 :(得分: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语义...阅读文档以确保你不泄密!

答案 1 :(得分:6)

以下是使用NSTimer的fireDate属性(用Swift编写)的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)
}

答案 2 :(得分:4)

您可以尝试调整计时器的FireDate,请参阅 setFireDate

答案 3 :(得分:1)

您无法更改计时器触发的间隔。没门。这样做没有API。

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

答案 4 :(得分: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]);
}