如何检查NSTimer是否正在运行?

时间:2010-12-30 13:43:54

标签: iphone objective-c nstimer

我有一个IBAction,按下按钮时,它会创建一个未安排的计时器。然后,如果相同的计时器已经启动,//执行某些操作,否则启动创建的计时器。 以下是我到目前为止的情况:

- (IBAction)button1Press {



 NSMethodSignature *sgn = [self methodSignatureForSelector:@selector(onTick:)];
 NSInvocation *inv = [NSInvocation invocationWithMethodSignature: sgn];
 [inv setTarget: self];
 [inv setSelector:@selector(onTick:)];

 NSTimer *tapTimer = [NSTimer timerWithTimeInterval: 1.0
           invocation:inv 
              repeats:NO];



 if (/*tapTimer is running*/) {//do something
  }else{



  NSRunLoop *runner = [NSRunLoop currentRunLoop];
    [runner addTimer: tapTimer forMode: NSDefaultRunLoopMode];
  }

 }

我的问题是如何作为条件。如果我把tapTimer isValid或!= nil然后它总是返回true,因为tapTimer已经被声明了。我不想让计时器无效或无效,因为按钮的主要目的是如果在1秒的时间间隔内按两次按钮,则执行操作。

如果有一种完全不同的方法来做我想做的事情那么请告诉我们!

感谢加载!

3 个答案:

答案 0 :(得分:2)

据我所知,到目前为止,我发现您正在尝试检查tapTimer是否正在运行。我有一个建议。使用变量来指示您是否正在运行tapTimer。运行计时器时,将此变量更改为true,当计​​时器的时间到达0并调用您选择的方法时,在此方法中将此变量更改为false。

这有帮助吗?

答案 1 :(得分:0)

我建议使用零检查确定您的计时器是否正在运行。

...
//Define _tapTimer in .h

if (_tapTimer) {//do something
}
else{
   _tapTimer = [[NSTimer timerWithTimeInterval: 1.0
           invocation:inv 
              repeats:NO] retain];
   NSRunLoop *runner = [NSRunLoop currentRunLoop];
   [runner addTimer: _tapTimer forMode: NSDefaultRunLoopMode];
}

...

-(void)timerFired:(NSTimer*)timer
{
   if(timer == _tapTimer)
   {
      //Handle timerfired
      [_tapTimer release], _tapTimer = nil;
   }
}

答案 2 :(得分:-1)

您可以查询RunLoop以了解循环中是否有这样的计时器

CFRunLoopRef loopRef = [[runner currentRunLoop] getCFRunLoop];
Boolean timerAdded = CFRunLoopContainsTimer(loopRef, (CFRunLoopTimerRef)timer ,kCFRunLoopDefaultMode)

if (timerAdded)
{
    ...
}

但是,我还没有测试过那段代码