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


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

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

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

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

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

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

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

2 14

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

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