NSTimer scheduledTimerWithTimeInterval:target:sele

2020-07-09 08:57发布

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

5条回答
贪生不怕死
2楼-- · 2020-07-09 09:35

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.

查看更多
劳资没心,怎么记你
3楼-- · 2020-07-09 09:37

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

dispatch_async(dispatch_get_main_queue(), ^{
    // Timer here
});
查看更多
4楼-- · 2020-07-09 09:48

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

查看更多
祖国的老花朵
5楼-- · 2020-07-09 09:53

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!");
}
查看更多
时光不老,我们不散
6楼-- · 2020-07-09 09:54

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];
查看更多
登录 后发表回答