Добавить работающий таймер отображения счетчика в приложение iOS, например секундомер часов?
Я работаю с приложением, которое обрабатывает события движения устройства и обновляет интерфейс с шагом в 5 секунд. Я хотел бы добавить в приложение индикатор, который будет отображать общее время работы приложения. Похоже, что счетчик, подобный секундомеру, как и родное приложение iOS Clock, является разумным способом подсчета времени, которое приложение работает, и отображения его пользователю.
В чем я не уверен, так это в технической реализации такого секундомера. Вот кто я такой. мышление:-
Если я знаю, сколько времени между обновлениями интерфейса, я могу складывать секунды между событиями и сохранять количество секунд в качестве локальной переменной. Кроме того, таймер с интервалом 0,5 секунды может обеспечить подсчет.
Если я знаю дату начала приложения, я могу преобразовать локальную переменную в дату для каждого обновления интерфейса с помощью
[[NSDate dateWithTimeInterval:(NSTimeInterval) sinceDate:(NSDate *)]
-
Я могу использовать NSDateFormatter с коротким временным стилем для преобразования обновленной даты в строку с помощью
stringFromDate
Метод -
Полученная строка может быть присвоена метке в интерфейсе.
-
В результате секундомер обновляется для каждого "тика" приложения.
Мне кажется, что эта реализация немного тяжеловата и не так текуча, как приложение секундомера. Есть ли лучший, более интерактивный способ подсчета времени, которое приложение работает? Может быть, есть что-то уже предоставленное iOS для этой цели?
2 ответа:
Почти то, что предложил @terry lewis, но с настройкой алгоритма:
1) запланируйте таймер
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];
2) когда таймер срабатывает, получите текущее время (это настройка, не считайте тики, потому что если есть колебания в таймере, подсчет тиков будет накапливать ошибку), а затем обновите пользовательский интерфейс. Кроме того, NSDateFormatter-это более простой и универсальный способ форматирования времени для отображения.
- (void)timerTick:(NSTimer *)timer { NSDate *now = [NSDate date]; static NSDateFormatter *dateFormatter; if (!dateFormatter) { dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"h:mm:ss a"; // very simple format "8:47:22 AM" } self.myTimerLabel.text = [dateFormatter stringFromDate:now]; }
Если вы посмотрите в Пример кода iAd от Apple в базовом проекте баннера у них есть простой таймер:
NSTimer *_timer; _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];
И метод, который у них есть
- (void)timerTick:(NSTimer *)timer { // Timers are not guaranteed to tick at the nominal rate specified, so this isn't technically accurate. // However, this is just an example to demonstrate how to stop some ongoing activity, so we can live with that inaccuracy. _ticks += 0.1; double seconds = fmod(_ticks, 60.0); double minutes = fmod(trunc(_ticks / 60.0), 60.0); double hours = trunc(_ticks / 3600.0); self.timerLabel.text = [NSString stringWithFormat:@"%02.0f:%02.0f:%04.1f", hours, minutes, seconds]; }
Он просто запускается с самого начала, довольно простой.