Отформатируйте секундомер в реальном времени до сотого с помощью Swift
У меня есть приложение, использующее NSTimer с интервалом обновления 0,01 секунды для отображения текущего секундомера в формате String как 00: 00.00 (mm: ss.SS). (По сути, клонирование встроенного секундомера iOS для интеграции в математические задачи спортивного времени в реальном времени, возможно, в будущем потребуется точность в миллисекунды)
Я использую (неправильно) NSTimer для принудительного обновления UILabel. Если пользователь нажимает Start, это код NSTimer, используемый для начала повторения функции:
displayOnlyTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("display"), userInfo: nil, repeats: true)
А вот функция, которая выполняется вышеупомянутым NSTimer:
func display() {
let currentTime = CACurrentMediaTime() - timerStarted + elapsedTime
if currentTime < 60 {
timeDisplay.text = String(format: "%.2f", currentTime)
}else if currentTime < 3600 {
var minutes = String(format: "%00d", Int(currentTime/60))
var seconds = String(format: "%05.2f", currentTime % 60)
timeDisplay.text = minutes + ":" + seconds
}else {
var hours = String(format: "%00d", Int(currentTime/3600))
var minutes = String(format: "%02d", (Int(currentTime/60)-(Int(currentTime/3600)*60)))
var seconds = String(format: "%05.2f", currentTime % 60)
timeDisplay.text = hours + ":" + minutes + ":" + seconds
}
}
Там будет по крайней мере 2 ссылки показа одновременно. Будет ли этот метод слишком неэффективным, когда все остальные элементы будут в игре?
Затем дисплей обновляется без использования NSTimer, когда пользователь нажимает «Стоп / Пауза / Сброс». Я не нашел ничего, что прямо переведено на Swift. Я почти уверен, что использую неэффективный метод для быстрого обновления текста UILabel в UIView.
Больше деталей: я работаю над менее запутанным кодом для текущего формата таймера (mm: ss.SS). Я обновлю это еще раз, когда я закончу это.
ОБНОВЛЕНИЕ: Спасибо Робу и jtbandes за ответы на оба моих вопроса (метод форматирования и метод обновления дисплея). Было легко заменить NSTimer (см. Выше) на CADisplayLink ():
displayLink = CADisplayLink(target: self, selector: Selector("display"))
displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
А затем заменить все экземпляры в коде
displayOnlyTimer.invalidate()
с
displayLink.paused = true
(это приостановит обновление отображаемой ссылки)