NSTimer not firing

2019-01-19 13:27发布

问题:

I have an NSTimer that I init with this code:

testTimer = [[NSTimer alloc] initWithFireDate:[new objectAtIndex:0] interval:0.0 target:self selector:@selector(works:) userInfo:nil repeats:NO];

[new objectAtIndex:0] is an NSDate in the past.

When I start up the app, the timer is getting created, with a fireDate of immediately (since the date is in the past), however it never calls my works method. (-(void)works:(id)sender )

Anybody know why this is happening?

回答1:

You will have to add it to the current run loop if you use initWith.. method to create the timer object.

NSRunLoop * theRunLoop = [NSRunLoop currentRunLoop];
[theRunLoop addTimer:testTimer forMode:NSDefaultRunLoopMode];

Or if you would like it set up for you, use the scheduled... methods to create your timer.



回答2:

I just recently had an issue with NSTimer. In my case I didn't realize that the method scheduledTimerWithTimeInterval is not multi thread safe. Once I moved the timer to the main thread it started working.



回答3:

I think I had the same problem as Dobler, but my solution was different.

The problem was that the timer was being created and scheduled in a GCD thread in a block within a

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{})

call (actually nested deep, so it wasn't obvious that this was the case).

Using NSTimer's scheduledTimerWithTimeInterval:... placed the timer into an invalid run loop.

The fix was to change to

timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(...) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];