Formate o cronômetro em tempo real até o centésimo usando o Swift
Eu tenho um aplicativo usando um NSTimer em intervalos de atualização de centissegundos (0,01 segundo) para exibir um cronômetro em execução no formato String como 00: 00.00 (mm: ss.SS). (Clonando basicamente o cronômetro interno do iOS para integrar-se a problemas matemáticos de cronometragem esportiva em tempo real, possivelmente precisando de milissegundos de precisão no futuro)
Eu uso (uso indevido?) O NSTimer para forçar a atualização do UILabel. Se o usuário pressionar Iniciar, este é o código NSTimer usado para começar a repetir a função:
displayOnlyTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("display"), userInfo: nil, repeats: true)
E aqui está a função que é executada pelo NSTimer acima:
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
}
}
Haverá pelo menos 2 links de exibição em execução ao mesmo tempo. Esse método será muito ineficiente quando todos os outros elementos estiverem em jogo?
A exibição é atualizada sem o uso do NSTimer quando o usuário pressiona parar / pausar / redefinir. Não encontrei nada que fosse traduzido diretamente para o Swift. Estou bastante certo de que estou usando um método ineficiente para forçar a atualização rápida do texto UILabel no UIView.
Mais detalhes: Estou trabalhando em um código menos confuso para o formato do cronômetro em execução (mm: ss.SS). Vou atualizar isso mais uma vez quando terminar.
ATUALIZAÇÃO: Agradecemos a Rob e jtbandes por responderem a minhas duas perguntas (método de formatação e método de atualização de exibição). Foi fácil substituir o NSTimer (veja acima) pelo CADisplayLink ():
displayLink = CADisplayLink(target: self, selector: Selector("display"))
displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
E depois substitua todas as instâncias no código de
displayOnlyTimer.invalidate()
com
displayLink.paused = true
(isso fará uma pausa na atualização do link de exibição)