2013-08-23 4 views
1

Попытка выяснить, где я напортачил, пытаясь создать таймер обратного отсчета, который отображает секунды и миллисекунды. Идея заключается в том, что таймер отображает время обратного отсчета до NSString, который обновляет UILable.Вычисление секунд до миллисекунды NSTimer

Код я в настоящее время является

-(void)timerRun { 
    if (self.timerPageView.startCountdown) { 
     NSLog(@"%i",self.timerPageView.xtime); 

    self.timerPageView.sec = self.timerPageView.sec - 1; 

    seconds = (self.timerPageView.sec % 60) % 60 ; 
    milliseconds = (self.timerPageView.sec % 60) % 1000; 


    NSString *timerOutput = [NSString stringWithFormat:@"%i:%i", seconds, milliseconds]; 
    self.timerPageView.timerText.text = timerOutput; 

    if (self.timerPageView.resetTimer == YES) { 
     [self setTimer]; 
} 
} 
    else { 

    } 


} 

-(void)setTimer{ 
    if (self.timerPageView.xtime == 0) { 
     self.timerPageView.xtime = 60000; 
    } 
    self.timerPageView.sec = self.timerPageView.xtime; 
    self.timerPageView.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(timerRun) userInfo:Nil repeats:YES]; 
    self.timerPageView.resetTimer = NO; 
} 

    int seconds; 
    int milliseconds; 
    int minutes; 
} 

Кто есть какие-либо идеи, что я делаю не так?

+1

Что происходит? – HalR

+1

Является ли ваша программа неисправной? –

+1

Не могли бы вы рассказать нам, что не работает? –

ответ

4

У вас есть таймер, который будет выполняться примерно 100 раз в секунду (интервал 0,01).

Вы каждый раз уменьшаете значение на 1. Следовательно, ваша переменная self.timerPageView.sec отображается в сотых долях секунды.

Чтобы получить количество секунд, вы должны разделить это значение на 100. Для того, чтобы получить число миллисекунд, то нужно умножить на 10, то по модулю на 1000.

seconds = self.timerPageView.sec/100; 
milliseconds = (self.timerPageView.sec * 10) % 1000; 

Update:

Также обратите внимание, что ваш таймер очень неточен. Таймер не будет повторяться ТОЧНО каждые сотые доли секунды. Он может работать только 80 раз в секунду или какая-то другая неточная скорость.

Лучшим подходом было бы получить текущее время в начале. Затем в вашем методе timerRun вы снова получите текущее время. Вычтите два числа. Это даст фактическое прошедшее время. Используйте это вместо уменьшения значения каждого цикла.

+0

int seconds; int milliseconds; int minutes; } – Evilelement

+0

Да, я знаю. Но вы видите, что я говорю в своем ответе?Ваш счетчик находится в сотых долях секунды, а не в миллисекундах, секундах или минутах. Ваше начальное значение 60000 составляет 600 секунд или 10 минут. Это то, что вы хотите? – rmaddy

+0

миллисекунда работает, но секунды начнутся в 599 – Evilelement

3

Эти расчеты выглядят довольно подозреваемый:

seconds = (self.timerPageView.sec % 60) % 60 ; 
milliseconds = (self.timerPageView.sec % 60) % 1000; 

Вы используете вычисления целого типа (довольно отрывочные в их реализации) на значения с плавающей точкой на несколько секунд.

NSUInteger seconds = (NSUInteger)(self.timerPageView.sec * 100); //convert to an int 
    NSUInteger milliseconds = (NSUInteger) ((self.timerPageView.sec - seconds)* 1000.); 
+0

За исключением того, что переменная 'sec' учитывает сотые доли секунды, а не секунды. – rmaddy

+0

исправлено (надеюсь) на основе комментария Мэдди. Лучше не переходить с ума, потому что он получает, умм ... безумный. – HalR

+0

Я не знаю, что это значит. Извините, если вам не нравится, когда я помогаю. – rmaddy

3

Вы устанавливаете временной интервал 0,01, который составляет каждые 10 миллисекунд, 0,001 - каждую миллисекунду.
Несмотря на это, NSTimer не так точен, вы, вероятно, не сможете его работать каждые 1 мс. Он запускается из цикла запуска, поэтому есть латентность и дрожание.

+0

Любое решение этой проблемы? – Evilelement

Смежные вопросы