可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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
回答1:
It was a thread issue. I've fixed with:
dispatch_async(dispatch_get_main_queue(), ^{ // Timer here });
回答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
回答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!"); }
回答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];
回答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
.