У меня есть приложение, использующее интервалы обновления NSTimer в секундах (0,01 секунды) для отображения рабочего секундомера в формате String как 00: 00.00 (mm: ss.SS). (В основном клонирование встроенного секундомера iOS для интеграции в математические задачи в реальном времени для спортивного времени, возможно, в будущем требуется точность миллисекунд)Формат таймера секундомера реального времени в сотый раз с использованием Swift
Я использую (неправильное использование?) NSTimer для принудительного обновления UILabel. Если пользователь нажимает кнопку Пуск, это код 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, когда пользователь нажимает кнопку stop/pause/reset. Я не нашел ничего, что непосредственно переводилось в Свифт. Я довольно уверен, что я использую неэффективный метод для принудительного обновления текста UILabel в UIView.
Подробнее: Я работаю над менее беспорядочным кодом для формата рабочего таймера (мм: ss.SS). Я обновлю это еще раз, когда закончу это.
ОБНОВЛЕНИЕ: Спасибо Rob и jtbandes за ответы на оба моих вопроса (метод форматирования и метод отображения отображения). Это было легко заменить NSTimer (см выше) с CADisplayLink():
displayLink = CADisplayLink(target: self, selector: Selector("display"))
displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
А затем заменить все экземпляры в коде
displayOnlyTimer.invalidate()
с
displayLink.paused = true
(это приостановить ссылку на отображение от обновления)
Как раз для моего собственного спокойствия, вы не создавали новый NSDateFormatter каждый раз, не так ли? Как и в, вы не создавали экземпляр NSDateFormatter внутри метода 'display()', правильно? – justinpawela
jtbandes прав, и вы должны принять этот ответ (используйте ссылку на изображение, а не таймер, определенно не назовите 'CACurrentMediaTime' несколько раз в рамках функции ... он мог бы поставить галочку на следующую минуту между одним вызовом и следующим, в результате чего результат совершенно неправильный: если вы используете форматирование, создайте его один раз и повторно его используете и т. д.). Кстати, если вы собираетесь делать это, как вы делали выше, вместо того, чтобы выяснить, больше ли вы 10 или нет, просто используйте строку формата, например '% 05.2f' (которая будет отформатировать ее как xx.xx, с начальным нулем). – Rob
К счастью, нет. Я сохраняю время начала для переменной, когда пользователь нажимает номер. Когда они приостанавливают его, я просто вычитаю время начала из CACurrentMediaTime() и добавляет его к текущему итогу. – mothy