Manoj Chandola
Manoj Chandola

Reputation: 156

how to invalidate NSTimer?

self.timerProgress=[NSTimer scheduledTimerWithTimeInterval:50.0 target:self selector:@selector(stopProgressView) userInfo:nil repeats:NO];

-(void)stopProgressView
{
    if ([self.timerProgress isValid]) {
        [self.timerProgress invalidate];
        self.timerProgress=nil;
    }  

}

and on a button click when i tried to invalidate NSTimer object

-(void)cancelTimer
{
       if ([self.timerProgress isValid]) {
            [self.timerProgress invalidate];
            self.timerProgress=nil;
        }   
}

it don't get invalidate. It calls once stopProgressView after the interval of 50. How to get resolve from this issue?

Upvotes: 1

Views: 605

Answers (4)

NANNAV
NANNAV

Reputation: 4901

You create NSTimer with out NSRunLoop so your NSTimer not started, to add this code after

self.timerProgress = [NSTimer scheduledTimerWithTimeInterval:50.0 
                                                      target:self 
                                                    selector:@selector(stopProgressView) 
                                                    userInfo:nil
                                                     repeats:NO];

 //add  

[[NSRunLoop currentRunLoop] addTimer:_tapTimer 
                             forMode:NSDefaultRunLoopMode];

Upvotes: 0

Gordon Dove
Gordon Dove

Reputation: 2577

The most likely reason for this is that your timer scheduled on a different run loop to the one where you try and invalidate it.

Timers must be invalidated on the same thread/runloop as the run loop that they are scheduled on.

Cocoa touch isn't thread safe, so you should be running all UI related activities on the main thread. It may work if you do GUI work on different threads, but then you'll get random crashes, and you'll also generate timer problems like this.

Upvotes: 1

AdamG
AdamG

Reputation: 3718

It seems like from what you're posting it should work. This is how I have it in my apps and it works fine.

However, you could try making the selector one that takes a timer object like:

-(void)stopProgressView:(NSTimer *)timer{
     //do stuff with timer here
}

Note that this would also mean that you should change @selector(stopProgressView) to @selector(stopProgressView:). Although for the record my current stop timer function just uses [self.timer invalidate] and it works fine.

My other piece of advice for debugging is to use NSLogs to make sure each of the methods are in fact getting called, and that when the method is called an NSLog within the if clause to make sure that works.

Upvotes: 0

Arthur
Arthur

Reputation: 1760

- (IBAction)stopTimer {
    if ([timerProgress isValid]) {
        [timerProgress invalidate];
    }
}

Don't use self.timerProgress use just timerProgress

Upvotes: 1

Related Questions