Добавить запущенный таймер отображения счета в приложение iOS, например, секундомер Clock?

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

Я не уверен в технической реализации такого секундомера. Вот что я думаю:

  • Если я знаю, сколько времени между обновлениями интерфейса, я могу добавить секунды между событиями и сохранить количество секунд в качестве локальной переменной. В качестве альтернативы, таймер с интервалом в 0,5 секунды может обеспечить счет.

  • Если я знаю дату начала приложения, я могу преобразовать локальную переменную на дату для каждого обновления интерфейса с помощью [[NSDate dateWithTimeInterval:(NSTimeInterval) sinceDate:(NSDate *)]

  • Я могу использовать NSDateFormatter с коротким стилем времени, чтобы преобразовать обновленную дату в строку с помощью метода stringFromDate

  • Полученная строка может быть назначена метке в интерфейсе.

  • В результате секундомер обновляется для каждого "тика" приложения.

Мне кажется, что эта реализация слишком тяжелая и не такая уж жидкая, как приложение секундомера. Есть ли лучший, более интерактивный способ подсчитать время работы приложения? Может быть, есть что-то уже предоставленное iOS для этой цели?

Ответ 1

Почти то, что было предложено, но с алгоритмом tweak:

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];
}

Ответ 2

Если вы посмотрите в пример кода 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];
}

Он просто запускается от запуска, довольно простой.