Ich habe etwas Code, der den Unterschied der Zeit zwischen heute und einer anderen Zeit Zeichenfolge erhält.NSTimer countdown produziert 0 zweimal
Die Anzeige wird jede Sekunde aktualisiert, indem NSTimer.scheduledTimerWithTimeInterval
verwendet wird.
Alles funktioniert gut, außer wenn der Timer 0 erreicht. 0
wird zweimal angezeigt.
Beispiel:
3,2,1,0,0,-1,-2
Unter meinen Code in Spielplatz getan getan wird:
//: Playground - Time Countdown
import UIKit
import XCPlayground
XCPSetExecutionShouldContinueIndefinitely()
class MyClass {
var totalSecondsText = ""
init(classSecondsText: String){
totalSecondsText = classSecondsText
}
@objc func ontimer(timer:NSTimer!){
let total = determineTimeDifference(totalSecondsText)
let (hour,min,sec) = secondsConverter(total)
if hour >= 1 {
if min >= 1 {
NSLog(String(hour)+"h "+String(min)+"m")
}else {
NSLog(String(hour)+"h")
}
}else{
if min >= 1{
NSLog(String(min)+"m "+String(sec)+"s")
} else if min > -1 {
NSLog(String(sec)+"s")
} else if min <= -1 {
NSLog(String(min)+"m")
}
}
}
func determineTimeDifference(timeInputed: String) -> Int {
let dateFormat = NSDateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
let finalDate = dateFormat.dateFromString(raceTime)
let differenceTimeInSeconds = (finalDate?.timeIntervalSinceNow)!
return differenceInSeconds
}
func secondsConverter (seconds : Int) -> (Int , Int, Int){
return (seconds/3600, (seconds % 3600)/60, (seconds % 3600) % 60)
}
}
// Add +1 minute on time to test.
var dateString = "2016-08-31T6:49:00Z"
NSTimer.scheduledTimerWithTimeInterval(1, target: MyClass(classSecondsText: dateString), selector: #selector(MyClass.ontimer(_:)), userInfo: nil, repeats: true)
Jede Idee, was schief gelaufen ist?
Update:
Wie versprochen, hier ist der Bug-Fix für dieses Problem:
func determineTimeDifference(timeInputed: String) -> Int {
let dateFormat = NSDateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
let finalDate = dateFormat.dateFromString(raceTime)?.timeIntervalSince1970
let dateNow = NSDate().timeIntervalSince1970
let differenceTimeInSeconds = Int(finalDate) - Int(dateNow)
return differenceInSeconds
}
Danke! Sogar - obwohl ich deine Erklärung nicht klar verstanden habe (ich bin ein Neuling in Swift), erklärte es mir sehr viel. Noch eine Sache, was meinst du mit gerundeten Unix-Zeiten? – Led
Nachdem ich deine Erklärung gründlich gelesen habe, habe ich es verstanden. Vielen Dank! – Led
Gern geschehen. Abgerundete Unix-Zeiten bedeuten Zeiten im Unix-Format, die einen gerundeten Wert der gerasteten Unix-Zeit aufweisen, die von einem unordentlichen Dezimalteil bereinigt wird, was möglicherweise zu einem Zählfehler führen kann. Z.B. eine Rundung von 1.459 wäre 1, 1.668 => 2 usw. Vielleicht, wenn die Kalenderkomponente die Zeit übersetzt, hat sie einen Teil von .2873 ... darin, zählt sie als ganze Sekunde. Indem wir es abrunden, werden wir diesen möglichen Fehler beseitigen. – pedrouan