Как проверить, работает ли NSTimer? - PullRequest
0 голосов
/ 30 декабря 2010

У меня есть 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 ]

2 голосов
/ 30 декабря 2010

Из того, что я понимаю, я вижу, что вы пытаетесь проверить, работает ли tapTimer или нет.У меня есть одно предложение.Используйте переменную для указания того, работает ли у вас tapTimer или нет.Когда вы запускаете таймер, вы изменяете эту переменную на true, а когда время таймера достигает 0 и вызывает выбранный вами метод, вы меняете эту переменную на false в этом методе.

Помогает ли это?

0 голосов
/ 30 декабря 2010

Вы можете запросить RunLoop, чтобы узнать, есть ли такой таймер внутри цикла

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

if (timerAdded)
{
    ...
}

, но я еще не тестировал этот код

0 голосов
/ 30 декабря 2010

Я бы порекомендовал использовать нулевую проверку, чтобы определить, работает ли ваш таймер или нет.

...
//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;
   }
}
...