Таймер обратного отсчета не точен

Я считаю до полуночи в моем приложении. Единственная проблема в том, что таймер обратного отсчета всегда выключен на 5 или более минут. Это никогда не закрывает фактическое время, оставшееся до полуночи. Я сделал математику и почти уверен, что это правильно, но, возможно, я делаю глупую ошибку.

-(void) timerRun
{
NSDateFormatter *formatterAmPm = [[NSDateFormatter alloc] init];
[formatterAmPm setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]];
[formatterAmPm setDateFormat:@"a"];

NSString *amPmString = [formatterAmPm stringFromDate:[NSDate date]];

secondsCount = secondsCount + 1;
int hours = ((12*3600)-(secondsCount))/3600;
int minutes = ((12*3600)-(secondsCount)-(hours*3600))/60;
int seconds = ((12*3600)-(secondsCount)-(hours*3600))%60;

NSString *timerOutput = [NSString stringWithFormat:@"%.2d:%.2d:%.2d", hours, minutes, seconds];
_countDownLabel.text = timerOutput;

if ((secondsCount == 0) && ([amPmString isEqualToString:@"AM"]))
{
    [_countdownTimer invalidate];
    _countdownTimer = nil;
    MainViewController *ViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
    ViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self.navigationController pushViewController:ViewController animated:YES];
    self.sidePanelController.centerPanel = [[UINavigationController alloc] initWithRootViewController:[[MainViewController alloc] init]];

}
}

-(void) setTimer
{
NSDateFormatter *formatterHour = [[NSDateFormatter alloc] init];
[formatterHour setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]];
[formatterHour setDateFormat:@"HH"];

NSDateFormatter *formatterMinute = [[NSDateFormatter alloc] init];
[formatterMinute setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]];
[formatterMinute setDateFormat:@"mm"];

NSDateFormatter *formatterSecond = [[NSDateFormatter alloc] init];
[formatterSecond setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]];
[formatterSecond setDateFormat:@"ss"];

NSDateFormatter *formatterAmPm = [[NSDateFormatter alloc] init];
[formatterAmPm setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]];
[formatterAmPm setDateFormat:@"a"];

NSString *amPmString = [formatterAmPm stringFromDate:[NSDate date]];
NSString *hourString = [formatterHour stringFromDate:[NSDate date]];
NSString *minuteString = [formatterHour stringFromDate:[NSDate date]];
NSString *secondString = [formatterHour stringFromDate:[NSDate date]];

int hour = (([hourString intValue]) * 60 * 60);
int minute = (([minuteString intValue]) * 60);
int second = [secondString intValue];
if ([amPmString isEqualToString:@"PM"])
{
    stopTime = 12*60*60;
}
else
{
    stopTime = 24*60*60;
}

secondsCount = hour + minute + second;

secondsCount = secondsCount - stopTime;

_countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self     selector:@selector(timerRun) userInfo:nil repeats:YES];
}

person heinst    schedule 04.07.2013    source источник
comment
NSTimers не являются точным средством отслеживания времени, поскольку они привязаны к циклу выполнения.   -  person CodaFi    schedule 04.07.2013


Ответы (1)


NSTimer не является точным, он сработает примерно в свое время. Это означает, что вы не можете использовать его для подсчета секунд, как вы пытаетесь.

Вместо этого вам нужно получить фактическое время в вашем методе timerRun и использовать его для определения количества оставшихся секунд. Вы уже вызываете [NSDate date], чтобы получить индикацию AM/PM, просто используйте его, чтобы также получить текущее время, а затем выполните расчет оставшихся секунд.

person CRD    schedule 04.07.2013