2016-08-13 3 views
4

Этот таймер не срабатывает каждую секунду, когда я проверяю журнал и пользовательский интерфейс, он, кажется, срабатывает каждые 3-4 секунды.Таймер не срабатывает каждую секунду на WatchKit

func startTimer() { 
    print("start timer") 
    timer = Timer.scheduledTimer(timeInterval: 1, 
           target: self, 
           selector: #selector(timerDidFire), 
           userInfo: nil, 
           repeats: true) 
} 

func timerDidFire(timer: Timer) { 
    print("timer") 
    updateLabels() 
} 

Это что-то, что произойдет на Watch из-за отсутствия возможностей, или что-то не так в моем коде?

Вот журнал, если это необходимо:

0.0396000146865845 
3.99404102563858 
7.97501903772354 
11.9065310359001 

EDIT:

И для уточнения, что я обновляя каждый второй является таймер тренировки, поэтому он должен быть обновлен каждую секунду, что тикает.

+0

Вы уверены, что журнал для «таймера» не печатается каждую секунду, а пользовательский интерфейс - это то, что не обновляется? – pbush25

+0

@ pbush25 да, это определенно журнал, идущий каждые 4 секунды. Я отправил журнал выше для деталей. Есть идеи? – SRMR

+0

Таймер работает по основной теме? –

ответ

1

Рассмотрите возможность использования метки WKInterfaceTimer вместо метки, которые вы используете, чтобы показать время:

объект А WKInterfaceTimer представляет собой особый тип метки, который отображает отсчет или отсчет вверх таймер. Используйте объект таймера, чтобы настроить время и вид текста таймера . Когда вы запускаете таймер, WatchKit автоматически обновляет отображаемый текст на Apple Watch от без дополнительных взаимодействий с вашим расширением. Apple Docs.

WatchOS будет брать на себя ответственность за сохранение этого уточненный. ОС обрабатывает ярлык для вас, но вы должны отслеживать прошедшее время: вам просто нужно установить NSDate для этого (см. Пример ниже).

Образец кода.

В вашем WKInterfaceController подкласса:

 

    // Hook up a reference to the timer. 
    @IBOutlet var workoutTimer: WKInterfaceTimer! 

    // Keep track of the time the workout started. 
    var workoutStartTime: NSDate? 

    func startWorkout() { 
     // To count up use 0.0 or less, otherwise the timer counts down. 
     workoutTimer.setDate(NSDate(timeIntervalSinceNow: 0.0)) 
     workoutTimer.start() 
     self.workoutStartTime = NSDate() 
    } 

    func stopWorkout() { 
     workoutTimer.stop() 
    } 

    func workoutSecondsElapsed() -> NSTimeInterval? { 
     // If the timer hasn't been started then return nil 
     guard let startTime = self.workoutStartTime else { 
      return nil 
     } 
     // Time intervals from past dates are negative, so 
     // multiply by -1 to get the elapsed time. 
     return -1.0 * self.startTime.timeIntervalSinceNow 
    } 

Всестороннее запись в блоге: here.

+0

Ничего себе это отлично выглядит, спасибо! – SRMR

3

Если ваше приложение занято чем-то еще, который блокирует или задерживает цикл выполнения от проверки, что время пожара неоднократно переходило, the timer will only fire once during that period:

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

В качестве альтернативы может быть более эффективным обновление вашего пользовательского интерфейса на основе ответа на изменение (например, наблюдения) или реакции на событие (например, обработчик завершения).

  • Это позволяет избежать создания занята работы приложения, когда он доведен до проверки еще на самом деле не имеет обновления пользовательского интерфейса для выполнения, если ничего не изменилось в течение интервала таймера.

  • Он также предотвращает игнорирование нескольких изменений в пределах интервала огня, поскольку шаблон, управляемый таймером, будет отображать только последнее изменение в пользовательском интерфейсе.

+0

Спасибо за ответ! Я думаю, что это имеет смысл. Но я думаю, что мой единственный вопрос заключается в том, что я просто обновляю пользовательский интерфейс для ярлыка, который показывает время, прошедшее в ходе тренировки, поэтому его нужно обновлять каждую секунду, и я использую тот же метод, что и в WWDC 2016 и документации для этого точного процесса. Если вы понимаете, о чем я? – SRMR

+0

Ах. Вы должны отредактировать свой вопрос и описать, что вы конкретно пытаетесь сделать. Основываясь на [вашем предыдущем вопросе] (http://stackoverflow.com/q/38937657/4151918), я решил, что вы обновляете калории. –

+0

Ах, понял. Я отредактировал вопрос, чтобы описать больше особенностей, поэтому спасибо. У вас есть идеи по этому поводу сейчас, когда у вас есть особенности, что прошло время? Я обновляюсь? – SRMR

Смежные вопросы