NSTimer的替代品

时间:2011-05-28 05:09:50

标签: objective-c nstimer

除了使用NSTimer之外还有其他选择。我得到CFRunLoopTimer但无法使其工作。
我之所以在寻找替代方案的原因是,在我的代码中,即使我使计时器无效,它仍在触发。我的代码是这样的


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

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

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

}

-(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 :(得分:0)

我发布的代码中没有发现任何明显的错误:

你是否 - 在任何机会 - 在不同的runloop环境中设置和拆除你的计时器,比如在不同的线程上? 这完全可以解释你描述的行为。

您可能想要考虑的另一件事是为alarmTimer属性提供自己的setter,在释放旧计时器之前使旧计时器失效并保留新计时器。这将排除您在其他地方重新设置属性的可能性,因此无法使旧属性无效。

答案 1 :(得分:0)

尝试致电

[self.alarmTimer isValid];

(小写“i”)。
此外,您可以考虑仅更新计时器开火日期,而不是安排另一个计时器,调用[self.alarmTimer setFireDate:];。如果您经常更新您的开火日期,可能会更便宜。如果您希望“暂停”计时器一段时间,您可以致电

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

这样计时器处于活动状态但从不触发。