How do I change timing for NSTimer?

梦想与她 提交于 2019-12-03 10:57:41

Sure you can do this. Change repeats:YES to repeats:NO so that the timer doesn't repeat, and then in onTimer, just start a new timer with a longer interval. You need a variable to hold your interval so that you can make it a bit longer each time through onTimer. Also, you probably don't need to retain the timer anymore, as it will only fire once, and when it does, you'll get a new timer.

I'm no Objective-C expert (or iOS expert...) and it's been a while but I think something like this:

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];
}

Something like that? Oh, and I'm really not too sure about the retain semantics here... read the docs to make sure you don't leak!

Daniel Witurna

Here is one solution to Hardik's question using NSTimer's fireDate property (written in Swift):

Swift 2

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)
}

Swift 3, 4, 5

var timeInterval = 0.50
Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: #selector(self.onTimer), userInfo: nil, repeats: true)

@objc func onTimer(timer: Timer) {
    timeInterval += 0.05
    timer.fireDate = timer.fireDate.addingTimeInterval(timeInterval)
}

You could try adjusting the timer's FireDate, see setFireDate

You can't change the interval at which a timer fires. No way. There's no API for doing this.

Two obvious workarounds: If you always change the interval, then you can just change the next time that the timer fires; this has precedence over the timer interval. Of course you have to do that every time the timer fires. If you sometimes change the interval, just invalidate the first timer and create a new timer with the new interval.

This just work like charm for me.

- (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]);
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!