2013-01-17 82 views
0

这里是我的代码:的NSDate倒计时与NSInterval

NSDate *currDate = [NSDate date]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
[dateFormatter setDateFormat:@"HH:mm:ss"]; 
NSString *currentTime = [dateFormatter stringFromDate:currDate]; 

NSDate *now = [NSDate date]; 
int interval = 1*60; // one minute (minutes*60) 
long int nowSeconds = (long int) [now timeIntervalSince1970]; 
int secondsLeft = interval - (nowSeconds % interval); 

NSDate *nextIntervalDate = [NSDate dateWithTimeIntervalSince1970:nowSeconds+secondsLeft]; 

NSString *nextTrigger = [dateFormatter stringFromDate:nextIntervalDate]; 

timeRemaining.text = [NSString stringWithFormat:@"%02d:%02d", secondsLeft/60, secondsLeft%60]; 

NSLog([NSString stringWithFormat:@"%@:%@", currentTime, nextTrigger]); 

if ([currentTime isEqualToString:nextTrigger]) { 

} 

问题是, '如果([currentTime的isEqualToString:nextTrigger])' 从来都不是平等的。因为nextTrigger在它们相等之前更改为下一个时间段。这里是NSLog:

2013-01-17 15:54:59.987 app[35987:c07] 15:54:59:15:55:00 
2013-01-17 15:54:59.997 app[35987:c07] 15:54:59:15:55:00  
2013-01-17 15:55:00.007 app[35987:c07] 15:55:00:15:56:00 <----RIGHT HERE 
2013-01-17 15:55:00.016 app[35987:c07] 15:55:00:15:56:00 

我的代码的nextTrigger基本上是当前时间的最近一个分钟的四舍五入。此外,整个代码段每隔1秒钟处于一个重复的NSTimer中。

我该如何解决这个问题?

+0

你能解释一下你的代码是应该做的? –

+0

基本上,当我按下一个按钮时,它会设置一个NSTimer来每隔1秒触发我的代码。它正在等待下一个“回合时间”。比如,如果是10:31:23那么它会倒数到10:32:00。如果时间是01:10:01那么它会倒计时到01:11:00 – objectiveccoder001

+0

然后,当倒计时结束时,如果([currentTime isEqualToString:nextTrigger]),其他代码将触发。 – objectiveccoder001

回答

-1

我有一个类似的问题。我所做的就是创建一个副本,并通过检查。(有一件事是同时拥有oldTriggernewTrigger已申报)检查这个代码

NSDate *currDate = [NSDate date]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
[dateFormatter setDateFormat:@"HH:mm:ss"]; 
NSString *currentTime = [dateFormatter stringFromDate:currDate]; 

NSDate *now = [NSDate date]; 
int interval = 1*60; // one minute (minutes*60) 
long int nowSeconds = (long int) [now timeIntervalSince1970]; 
int secondsLeft = interval - (nowSeconds % interval); 

NSDate *nextIntervalDate = [NSDate dateWithTimeIntervalSince1970:nowSeconds+secondsLeft]; 
oldTrigger = nextTrigger; 
nextTrigger = [dateFormatter stringFromDate:nextIntervalDate]; 

timeRemaining.text = [NSString stringWithFormat:@"%02d:%02d", secondsLeft/60, secondsLeft%60]; 

NSLog([NSString stringWithFormat:@"%@:%@", currentTime, nextTrigger]); 

if ([currentTime isEqualToString:oldTrigger]) { 

} 
+0

这会导致应用程序因某种原因崩溃。 Thread1:EXEC_BAD_ACCESS在这一行:if([currentTime isEqualToString:oldTrigger]){ – objectiveccoder001

+0

Put nextTrigger = [dateFormatter stringFromDate:nextIntervalDate]; 之前oldTrigger = nextTrigger,并没有导致崩溃,但唉,oldtrigger和当前时间仍然不相等 – objectiveccoder001

+0

这项工作?他们之所以不相同的原因是因为newTrigger更新到快速。如果这不是错误,那么确保oldTrigger = nextTrigger在nextTrigger = [dateFormatter stringFromDate:nextIntervalDate]之前; – BigT

0

如果你有代码想在下一整分钟过后触发,那么重复检查以确定是否已经过去了,效率很低。将该代码放在自己的方法中,并创建一个NSTimer以在适当的时候触发它。

NSDate* date = [NSDate date] ; 
NSCalendar* calendar = [NSCalendar currentCalendar] ; 

NSDateComponents* secondsComponents = [calendar components:NSSecondCalendarUnit fromDate:date] ; 
NSTimeInterval secondsUntilNextWholeMinute = 60 - secondsComponents.second ; 
[NSTimer scheduledTimerWithTimeInterval:secondsUntilNextWholeMinute target:self selector:@selector(yourMethod) userInfo:nil repeats:NO ] ; 
+0

哦,忘了提及,我在这里使NSTimer失效,如果([currentTime isEqualToString:oldTrigger]){所以它只发生一次。虽然谢谢! – objectiveccoder001

+0

我的意思是,而不是让你的代码每隔0.1秒运行一次以检查下一整分钟是否已经过去,你可以简单地告诉iOS在特定时间运行某种方法。 –

+0

啊!我喜欢。让我试着去实现它。 – objectiveccoder001