NSTimer вызывает странную задержку - PullRequest
1 голос
/ 11 июля 2011

Хорошо, мое первое приложение - это таймер. Сразу после того, как я устроил Привет, мир, как кажется. Я использую класс NSTimer в качестве таймера и запускаю его каждую секунду, а затем меняю текст в UILabel. Теперь все это работает очень хорошо, за исключением моего самого первого запуска. Каждый раз, когда я запускаю приложение в симуляторе и запускаю таймер, в последнюю секунду происходит странная задержка, оно останавливается примерно на 2 секунды, а затем продолжается, как будто все в порядке. И тогда он работает для каждого набора, который работает.

Вот код, где я настроил NSTimer:

theTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0) target:self selector:@selector(onTimer) userInfo:nil repeats:YES];

Затем в методе onTimer я вызываю updateLabel

countDownLabel.text = [NSString stringWithFormat:@"%02d:%02d", startMin,startSec];
//Check if sets are complete
if(setCount <= numOfSets)
{
    setLabel.text = [NSString stringWithFormat:@"Set %02d of %02d", setCount, numOfSets];
    //check if timer is complete
    if(startMin <= 0 && startSec <= 0)
    {
        countDownLabel.textColor = [UIColor greenColor];
        //run interval timer when timer is complete
        if(intervalBetweenSets <= intervalBetweenSetsSetting)
        {
            setLabel.text = [NSString stringWithFormat:@"Starting set"];
            intervalBetweenSets++;
            intervalCounterSec--;
            countDownLabel.text = [NSString stringWithFormat:@"00:%02d", intervalCounterSec];
        }
        else
        {
            //RESET values on timer label
            TimerSettings *myTimer = [TimerSettings sharedManager ];
            startMin = myTimer.min;
            startSec = myTimer.sec;
            intervalBetweenSets = 0;
            intervalCounterSec = intervalBetweenSetsSetting+1;
            countDownLabel.textColor = [UIColor redColor];
            countDownLabel.text = [NSString stringWithFormat:@"%02d:%02d", startMin,startSec];
            setLabel.text = [NSString stringWithFormat:@"Set %02d of %02d", setCount, numOfSets];
        }
    }
    else
    {
        //Actual timer for display
        if(startSec == 0)
        {
            startMin = startMin - 1;
        }
        startSec = startSec - 1;
        if(startSec == -1)
        {
            startSec = 59;
        }
        if(startMin <= 0 && startSec < 1)
        {
            //increment number of completed sets
            setCount++;
            //play sound when timer completes
            if (audioPlayer == nil)
                ;
            else
            {
                [audioPlayer play];
            }
        }

        countDownLabel.text = [NSString stringWithFormat:@"%02d:%02d", startMin,startSec];
    }
}

Дело в том, что я не знаю, если это какая-то проблема с таймером или это имеет какое-то отношение к моей логике, если что-то неясно с тем, что я делаю, пожалуйста, спросите, и я уточню.

Спасибо

1 Ответ

1 голос
/ 11 июля 2011

Вы не должны использовать NSTimer для сохранения времени, если это то, что вы пытаетесь сделать, NSTimers концептуально помещены в сигнал события и поэтому могут запускаться только тогда, когда ваше программирование ожидает ввода от события события.Yo может использовать NSTimers, чтобы сообщать вам поля, чтобы обновить отображение самого себя, но чтобы получить количество прошедшего времени, вы должны либо использовать методы NSDate, либо эквивалентные функции Си.

...