除了使用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];
}
问题是如果我更新时间大于先前设定的时间,那么定时器也只是在旧时间点火。请帮助我坚持这个....
答案 0 :(得分:0)
我发布的代码中没有发现任何明显的错误:
你是否 - 在任何机会 - 在不同的runloop环境中设置和拆除你的计时器,比如在不同的线程上? 这完全可以解释你描述的行为。
您可能想要考虑的另一件事是为alarmTimer
属性提供自己的setter,在释放旧计时器之前使旧计时器失效并保留新计时器。这将排除您在其他地方重新设置属性的可能性,因此无法使旧属性无效。
答案 1 :(得分:0)
尝试致电
[self.alarmTimer isValid];
(小写“i”)。
此外,您可以考虑仅更新计时器开火日期,而不是安排另一个计时器,调用[self.alarmTimer setFireDate:];
。如果您经常更新您的开火日期,可能会更便宜。如果您希望“暂停”计时器一段时间,您可以致电
[self.alarmTimer setFireDate:[NSDate distantFuture]];
这样计时器处于活动状态但从不触发。