[Solved] NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats doesn’t invoke the method

The timer never invokes the method. What am I doing wrong ? This is the code:

NSTimer *manualOverlayTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(hideManual) userInfo:nil repeats:NO];

method:

-(void)hideManual

thanks

Enquirer: aneuryzm

||

Solution #1:

It was a thread issue. I’ve fixed with:

dispatch_async(dispatch_get_main_queue(), ^{
    // Timer here
});
Respondent: aneuryzm

Solution #2:

You don’t need an NSTimer for a task of this sort. To hide your view object after a specific period of time on main thread you can use a gcd method dispatch_after

  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 2.0), dispatch_get_main_queue(), ^(void){
    // Your code
  });

where 2.0 is an amount of seconds that will pass before the block will get executed

Respondent: aneuryzm

Solution #3:

Just use this

[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(hideManual) userInfo:nil repeats:NO];

EDIT

This code work well when btn (an UIButton) pressed and -(void)btnPressed function called.

-(void)btnPressed{
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(hideManual) userInfo:nil repeats:NO];
}

-(void)hideManual{
    NSLog(@"Hi, I'm here!");
}
Respondent: Eugene

Solution #4:

try this :

NSTimer *manualOverlayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                              target:self
                              selector:@selector(hideManual)
                              userInfo:nil
                              repeats:YES];

repeat:YES instead of [[NSRunLoop currentRunLoop] addTimer:manualOverlayTimer forMode:NSDefaultRunLoopMode];
Respondent: Hamed Rajabi

Solution #5:

in your code fragments it does not show when and where the NSTimer is fired.

if you want to use the NSTimer, you should fire the timer after the init, like this:

NSTimer *_timer = [NSTimer scheduledTimerWithTimeInterval:2.f target:self selector:@selector(hideManual) userInfo:nil repeats:false];
[_timer fire];

but you can use the following line in your any method as well:

[self performSelector:@selector(hideManual) withObject:nil afterDelay:2.f];

it looks easier in this case than working with NSTimer.

Respondent: Mutawe

The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .

Leave a Reply

Your email address will not be published.