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

109
11

Я создаю контроллер игрового представления, используя NSTimer чтобы обновить индикатор выполнения, представляющий оставшееся время текущего раунда игры. В этом игровом представлении также отображается кнопка, выполняющая некоторые световые обновления данных. Когда оставшееся время заканчивается, таймер становится недействительным и вызывается новое представление.

В первый раз, когда игровой просмотр загружается в жизненный цикл приложения, он отлично работает: без замедления при нажатии кнопки и обновления основных данных. Но когда я отказываюсь от одного и того же игрового представления в жизненном цикле приложения, нажатия кнопок делают индикатор прогресса нестабильным и безответственным.

Является ли NSTimer должным образом недействительным в цикле запуска? Должен ли я использовать CADisplayLink вместо этого, хотя мое представление не использует много ресурсов?

Заранее спасибо.

Вот мой код:

Объявление таймера в файле .h:

@property (weak, nonatomic) NSTimer *updatetimer;

Создание таймера в viewDidLoad:

self.updatetimer = [NSTimer timerWithTimeInterval:counterStep target:self selector:@selector(updateProgress) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self.updatetimer forMode:NSRunLoopCommonModes];

Функция updateProgress:

  - (void)updateProgress
{
//compute current time
currentTime = currentTime - counterStep;

//set timer label to int value of current time
self.timerLabel.text = [[NSString alloc] initWithFormat:@"%d",[[NSNumber numberWithDouble:currentTime] intValue]];

//update progress bar accordingly
[self.progressbar setProgress: currentTime / totalTime animated:YES];

if(currentTime <= 0)
{
//call the method that invalidates the timer + pushes to the next view
[self overallTimeEnd];
}
}

Недействительность таймера:

[self.updatetimer invalidate];
self.updatetimer = nil;

спросил(а) 2021-01-19T16:58:45+03:00 6 месяцев, 1 неделя назад
1
Решение
109

Здесь недостаточно, чтобы диагностировать проблему. Учитывая, что вы подтвердили, что ваш первоначальный таймер успешно недействителен, следующее, что нужно проверить, - убедиться в том, что проблема в том, что updateProgress не получает вызываемую нужную частоту (вместо того, чтобы обновлять переменные состояния, которые updateProgress полагается на).

Но предположим, что проблема в том, что updateProgress не получает требуемую частоту. Если это так, то это, вероятно, то, что вы используете в этом основном потоке, что мешает таймеру работать с нужной частотой. Трудно сказать, не видя, что делает updateProgress, и многое другое, что вы могли бы запустить в основном потоке. WWDC 2012 видео Создание параллельных пользовательских интерфейсов на iOS иллюстрирует, как использовать инструменты, чтобы найти, что может негативно повлиять на одновременный UX.

Наконец, это не ясный базовый процесс, который updateProgress информирует нас, но если вы можете перейти к подходу, основанному на событиях (например, если подключено к сети, обновите интерфейс, как didReceiveData вместо использования таймера). Иногда вам приходится использовать таймеры, но если вы можете избежать этого, вы сможете повысить эффективность приложения.

ответил(а) 2021-01-19T16:58:45+03:00 6 месяцев, 1 неделя назад
46

Итак, наконец, нашел, что заставило мой таймер не освободиться от жизненного цикла приложения: я не использовал разматывать segues в своем раскадровке, чтобы вернуться между представлениями, но стандартными нажатиями. Никогда не использовал их раньше и не знал о них... Спасибо всем вам за помощь.

ответил(а) 2021-01-19T16:58:45+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема