NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats不调用该方法

计时器从不调用该方法。 我究竟做错了什么 ? 这是代码:

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

方法:

 -(void)hideManual 

谢谢

这是一个线程问题。 我已经修复了:

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

你不需要NSTimer来完成这种任务。 要在主线程的特定时间段后隐藏视图对象,可以使用gcd方法dispatch_after

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

其中2.0是在块被执行之前经过的秒数

只要使用这个

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

编辑

这个代码在btn (一个UIButton )被按下时调用-(void)btnPressed函数。

 -(void)btnPressed{ [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(hideManual) userInfo:nil repeats:NO]; } -(void)hideManual{ NSLog(@"Hi, I'm here!"); } 

尝试这个 :

 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]; 

在你的代码片段中,它不会显示NSTimer何时何地被触发。

如果你想使用NSTimer ,你应该在init之后触发定时器,如下所示:

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

但是您也可以在任何方法中使用以下行:

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

在这种情况下看起来比使用NSTimer更容易。