Альтернатива NSTimer - PullRequest
0 голосов
/ 28 мая 2011


Есть ли другая альтернатива, кроме использования NSTimer. Я получил CFRunLoopTimer, но не смог заставить его работать.
Причина, по которой я ищу альтернативу, заключается в том, что в моем коде, даже если я делаю недействительным таймер, он все еще срабатывает. Мой код выглядит примерно так

<code>
-(void)SetTimerTo:(NSInteger)timePeriod
{
    self.alarmTimer=[NSTimer scheduledTimerWithTimeInterval: timePeriod
                                                       target: self
                                                     selector: @selector(TimerFired)
                                                     userInfo: nil
                                                      repeats: NO]; 
}</p>

<p>-(void)StopTimer
{
    [self.alarmTimer invalidate];
    self.alarmTimer=nil;
}</p>

<p>-(void)TimerFired
{
//Show alarm expired.
//Check if any other alarms are scheduled.If any again set the alarm. </p>

<p>}</p>

<p>-(void)UpdateTimerTo:(NSInteger)timePeriod
{
     if([self.alarmTimer IsValid])
     {
          [self.alarmTimer invalidate];
     }
    self.alarmTimer=[NSTimer scheduledTimerWithTimeInterval:timePeriod
           target: self selector:@selector(TimerFired)                                               userInfo: nil repeats: NO]; 
}
-(void)DeleteAlarm
{
[self StopTimer];
}
Проблема в том, что если я обновляю время больше, чем ранее установленное время, то таймер также срабатывает только в старое время. Пожалуйста, помогите, я застрял с этим ....

Ответы [ 2 ]

0 голосов
/ 28 мая 2011

Попробуйте позвонить

[self.alarmTimer isValid];

(строчная буква "i").
Кроме того, вместо планирования другого таймера, вы можете обновить только дату запуска таймера, вызывая [self.alarmTimer setFireDate:];. Это может быть дешевле, если вы часто обновляете свою дату пожара. Если вы хотите «аннулировать» таймер на некоторое время, вы можете позвонить

[self.alarmTimer setFireDate:[NSDate distantFuture]];

таким образом, таймер активен, но никогда не срабатывает.

0 голосов
/ 28 мая 2011

Поскольку я не вижу очевидных ошибок в коде, который вы разместили:

Вы - случайно - настраиваете ли вы и отключаете ли вы свои таймеры в различных контекстах runloop, как в разных потоках?
Это полностью объяснило бы поведение, которое вы описываете.

Еще одна вещь, которую вы, возможно, захотите рассмотреть, - это предоставление собственного установщика для свойства alarmTimer, в котором вы аннулируете старый таймер, прежде чем отпустить его и сохранить новый. Это исключит возможность того, что вы переустановите свойство где-то еще и, следовательно, не сможете достать старую для аннулирования.

...