Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I change timing for NSTimer?

I have the following code:

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

-(void) onTimer 
{
}

After every 0.50 seconds the OnTimer method is called.

But now I want to increment the time-interval.

That means:

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.

Is there any solution for this?? I have tried lot but its not working.

like image 732
Hardik Patel Avatar asked Nov 11 '10 07:11

Hardik Patel


4 Answers

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!

like image 96
heavi5ide Avatar answered Oct 24 '22 01:10

heavi5ide


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)
}
like image 37
Daniel Witurna Avatar answered Oct 24 '22 01:10

Daniel Witurna


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

like image 4
CodeWombat Avatar answered Oct 24 '22 01:10

CodeWombat


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.

like image 1
gnasher729 Avatar answered Oct 24 '22 01:10

gnasher729