Format Echtzeit-Stoppuhr-Timer auf den Hundertsten mit Swift

Ich habe eine App, die einen NSTimer in Aktualisierungsintervallen von 0,01 Sekunden verwendet, um eine laufende Stoppuhr im Zeichenfolgenformat 00: 00.00 (mm: ss.SS) anzuzeigen. (Grundsätzlich das Klonen der in iOS integrierten Stoppuhr, um in Echtzeit Sport-Timing-Mathematik-Probleme zu integrieren, die möglicherweise in Zukunft eine Millisekunden-Genauigkeit erfordern)

Ich verwende (missbrauche?) Den NSTimer, um die Aktualisierung des UILabels zu erzwingen. Wenn der Benutzer Start drückt, ist dies der NSTimer-Code, mit dem die Wiederholung der Funktion gestartet wird:

displayOnlyTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("display"), userInfo: nil, repeats: true)

Und hier ist die Funktion, die vom obigen NSTimer ausgeführt wird:

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

Es werden mindestens 2 Display-Links gleichzeitig ausgeführt. Ist diese Methode zu ineffizient, wenn alle anderen Elemente im Spiel sind?

Die Anzeige wird dann ohne Verwendung von NSTimer aktualisiert, wenn der Benutzer Stopp / Pause / Zurücksetzen drückt. Ich habe nichts gefunden, was direkt in Swift übersetzt worden wäre. Ich bin mir ziemlich sicher, dass ich eine ineffiziente Methode verwende, um das schnelle Aktualisieren des Texts UILabel in UIView zu erzwingen.

Mehr Details: Ich arbeite an weniger unordentlichem Code für das laufende Timer-Format (mm: ss.SS). Ich werde dies noch einmal aktualisieren, wenn ich damit fertig bin.

UPDATE: Vielen Dank an Rob und jtbandes für die Beantwortung meiner beiden Fragen (Formatierungsmethode und Anzeigeaktualisierungsmethode). Es war einfach, den NSTimer (siehe oben) durch CADisplayLink () zu ersetzen:

displayLink = CADisplayLink(target: self, selector: Selector("display"))
        displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)

Und dann ersetzen Sie alle Instanzen im Code von

displayOnlyTimer.invalidate() 

mi

displayLink.paused = true 

(Dadurch wird der Anzeigelink von der Aktualisierung angehalten.)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage