Mam app za pomocą NSTimer w centisecond (0,01 sekundy) interwały aktualizacji, aby wyświetlić uruchomiony stoper w formacie ciągu jako 00: 00.00 (mm: ss.SS). (Zasadniczo klonowanie wbudowanego stopera iOS w celu zintegrowania z matematyką czasu rzeczywistego w czasie rzeczywistym, prawdopodobnie wymagające milisekundowej dokładności w przyszłości)Formatowanie czasu rzeczywistego stopera na setne przy użyciu Swift
Używam (niewłaściwe użycie?) NSTimer'a do wymuszania aktualizacji UILabel. Jeśli użytkownik naciśnie przycisk Start, jest to kod NSTimer używany do uruchamiania powtórzenie funkcji:
displayOnlyTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("display"), userInfo: nil, repeats: true)
i tutaj jest funkcja, która jest wykonywana przez wyżej 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
}
}
będzie co najmniej 2 łącza wyświetlacza działające w tym samym czasie. Czy ta metoda będzie zbyt nieefektywna, gdy wszystkie inne elementy będą w grze?
Wyświetlacz jest następnie aktualizowany bez użycia NSTimer, gdy użytkownik naciśnie przycisk stop/pause/reset. Nie znalazłem niczego, co bezpośrednio przełożyłoby się na Swift. Jestem dość pewny, że używam nieefektywnej metody, aby wymusić aktualizację tekstu UILabel szybko w UIView.
Więcej szczegółów: Pracuję nad mniej niechlujnym kodem dla formatu zegarka (mm: ss.SS). Zaktualizuję to jeszcze raz, kiedy to skończę.
AKTUALIZACJA: Dzięki Robowi i aplikacjom odpowiadającym na oba moje pytania (metoda formatowania i sposób aktualizacji ekranu). Łatwo było wymienić NSTimer (patrz wyżej) z CADisplayLink():
displayLink = CADisplayLink(target: self, selector: Selector("display"))
displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
a następnie zastąpić wszystkie wystąpienia w kodzie
displayOnlyTimer.invalidate()
z
displayLink.paused = true
(będzie wstrzymać aktualizację łącza wyświetlacza)
Tylko dla własnego spokoju ducha, nie tworzyłeś nowego NSDateFormattera za każdym razem, prawda? W tej sytuacji nie tworzyłeś instancji NSDateFormatter wewnątrz metody 'display()', prawda? – justinpawela
jtbandes ma rację i powinieneś zaakceptować tę odpowiedź (użyj linku wyświetlania, a nie licznika czasu, zdecydowanie nie wywołuj 'CACurrentMediaTime' wiele razy w funkcji ... mógł on przejść do następnej minuty między jednym a drugim połączeniem, w wyniku czego wynik jest całkowicie błędny, jeśli używasz formatera, stwórz go raz i użyj ponownie, itd.). Przy okazji, jeśli masz zamiar zrobić to tak, jak zrobiłeś powyżej, zamiast zastanawiać się, czy masz więcej niż 10, czy nie, po prostu użyj ciągu formatów takiego jak '% 05.2f' (który sformatuje go jako xx.xx, z wiodącym zerem). – Rob
Na szczęście nie. Oszczędzam czas rozpoczęcia do zmiennej, gdy użytkownik naciśnie liczbę. Kiedy wstrzymują, po prostu odejmuję czas rozpoczęcia od CACurrentMediaTime() i dodaje go do sumy całkowitej. – mothy