Inovize
Inovize

Reputation: 233

Stopping an NSTimer

Hi I am trying to stop an NSTimer by using "invalidate" however from everything that I have tried I cant seem to get the timer to stop. Here is the code that I have to make this work. I am trying to stop the timer from a different class.

My Timer

_tripTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                              target:self
                                            selector:@selector(updateTimerLabel:)
                                            userInfo:[NSDate date]
                                            repeats:YES];

which is synthesized and is strong

and the stopping method:

-(void)stopTimer
{
    [_tripTimer invalidate];
}

and in my other class to get it to stop I am doing this:

  [_carTripViewController stopTimer];

however that is not working. It is performing the method but not stopping the timer. Im not sure if i am creating a new instance and that is why it is not working. How can I get it to invalidate from another class?

Thank you! I am fairly new to objective-c and not sure how to access it

Upvotes: 1

Views: 335

Answers (3)

Chris
Chris

Reputation: 4593

I had a similar problem and what I did was to add the timer to my appDelegade and use that as my timer context. Im not sure if this is academically 100% correct, but it works for me and is a workable hack at least. So far I haven't run into any problems and my app has been used extensively. See my code example:

if (!self.pollerTimer) {
    self.pollerTimer = [NSTimer scheduledTimerWithTimeInterval:POLLER_INTERVAL
                                                        target:self
                                                      selector:@selector(performPollinginBackground)
                                                      userInfo:nil
                                                       repeats:YES];

    //adds the timer variable and associated thread to the appDelegade. Remember to add a NSTimer property to your appDeledade.h, in this case its the pollerTimer variable as seen
    NUAppDelegate *appDelegate = (NUAppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.pollerTimer = self.pollerTimer;
}

Then when I want to stop the timer from anywhere in my app I can do the following:

NUAppDelegate *appDelegate = (NUAppDelegate *)[[UIApplication sharedApplication] delegate];

if (appDelegate.pollerTimer) {
    [appDelegate.pollerTimer invalidate];
    appDelegate.pollerTimer = nil;
}

Upvotes: 0

clubifaximatic
clubifaximatic

Reputation: 131

In the docoumentation about the invalidate method Apple says:

Special Considerations

You must send this message from the thread on which the timer was installed. If you send this message from another thread, the input source associated with the timer may not be removed from its run loop, which could prevent the thread from exiting properly.

If you create the thread in the main method you can stop it in the main method by calling:

[self performSelectorOnMainThread:@selector(myMethod:) 
    withObject:anObj waitUntilDone:YES];

in your case something like:

[_carTripViewController performSelectorOnMainThread:@selector(stopTimer:) 
    withObject:nil waitUntilDone:YES];

Upvotes: 2

Andrey Chernukha
Andrey Chernukha

Reputation: 21808

I see two most probable causes:

1) You send stopTimer message to a different object of your class, not the one which where the timer has been launched.

2) _tripTimer variable doesn't point to the timer object any more, it points to somewhere else, probably to nil.

Upvotes: 0

Related Questions