2016-08-31 4 views
2

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 

enter image description here

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 
} 

Antwort

1

Ihr Code ist gut versorgt, und die Bedingungen sind richtig platziert. Es sieht so aus, als würde Data.components die Differenz nicht korrekt verarbeiten. Dies kann durch Rundung der Sekundenkomponente verursacht werden.

Wenn vor dem Zeitpunkt zu zählen, wenn die aktuelle Zeit und Endzeit wird gleich, (Reichweite 0,0), das Ergebnis mit einem Fehler von -1 kommt.

Wenn ich Ihren Code mit zusätzlichen Drucken aktualisiert wurden diese gezeigt:

CURRENT date: 2016-08-31 13:10:57 +0000 - FINAL date: 2016-08-31 13:11:00 +0000 
-->> diff by DateComponents: 2s (BAD) 
CURRENT unix: 1472649057.28685 - FINAL unix: 1472649060.0 
--->>> Diff in UNIX: -3.0s (counted as Rounded CURRENT UNIX - FINAL UNIX) 
2s 

CURRENT date: 2016-08-31 13:10:58 +0000 - FINAL date: 2016-08-31 13:11:00 +0000 
-->> diff by DateComponents: 1s (BAD) 
CURRENT unix: 1472649058.28734 - FINAL unix: 1472649060.0 
--->>> Diff in UNIX: -2.0s (counted as Rounded CURRENT UNIX - FINAL UNIX) 
1s 

CURRENT date: 2016-08-31 13:10:59 +0000 - FINAL date: 2016-08-31 13:11:00 +0000 
-->> diff by DateComponents: 0s (BAD) 
CURRENT unix: 1472649059.28731 - FINAL unix: 1472649060.0 
--->>> Diff in UNIX: -1.0s (counted as Rounded CURRENT UNIX - FINAL UNIX) 
0s 

CURRENT date: 2016-08-31 13:11:00 +0000 - FINAL date: 2016-08-31 13:11:00 +0000 
-->> diff by DateComponents: 0s (OK) 
CURRENT unix: 1472649060.28731 - FINAL unix: 1472649060.0 
--->>> Diff in UNIX: 0.0s (counted as Rounded CURRENT UNIX - FINAL UNIX) 
0s 

CURRENT date: 2016-08-31 13:11:01 +0000 - FINAL date: 2016-08-31 13:11:00 +0000 
-->> diff by DateComponents: -1s (OK) 
CURRENT unix: 1472649061.28731 - FINAL unix: 1472649060.0 
--->>> Diff in UNIX: 1.0s (counted as Rounded CURRENT UNIX - FINAL UNIX) 
-1s 

CURRENT date: 2016-08-31 13:11:02 +0000 - FINAL date: 2016-08-31 13:11:00 +0000 
-->> diff by DateComponents: -2s (OK) 
CURRENT unix: 1472649062.28729 - FINAL unix: 1472649060.0 
--->>> Diff in UNIX: 2.0s (counted as Rounded CURRENT UNIX - FINAL UNIX) 
-2s 

wenn verwendet, Zählen, durch Differenz zwischen dem gerundeten Unix-Zeiten So die Ergebnisse korrekt sind.

Fazit: Der Fehler kommt manchmal vor der Gleichung, manchmal kommt danach. Es hängt davon ab, zu welcher Zeit das Skript gestartet wurde. Wenn das Zählen nach Datenkomponenten mit einem Fehler beginnt, wird nach 0, 0 bereinigt. Wenn das Zählen mit dem korrekten Ergebnis beginnt, beginnen die Ergebnisse Fehler zu liefern. Deshalb erscheint Null zweimal - in dem Moment, in dem das Ergebnis seinen genauen Status ändert.

+0

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

+0

Nachdem ich deine Erklärung gründlich gelesen habe, habe ich es verstanden. Vielen Dank! – Led

+0

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