2016-08-31 1 views
2

J'ai du code qui obtient la différence de temps entre aujourd'hui et une autre chaîne de temps.compte à rebours NSTimer produisant 0 deux fois

L'affichage est actualisé toutes les secondes en utilisant NSTimer.scheduledTimerWithTimeInterval.

Tout fonctionne correctement, sauf lorsque la minuterie atteint 0. 0 est affiché deux fois.

Exemple:

3,2,1,0,0,-1,-2 

enter image description here

Voici mon code fait fait dans la cour:

//: 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) 

Toute idée sur ce qui a mal tourné?

Mise à jour:

Comme promis, voici le correctif de bug pour ce numéro:

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 
} 

Répondre

1

Votre code est bien fourni, et les conditions sont placés correctement. Il semble que Data.components ne gère pas la différence de comptage correctement. Cela peut être causé par l'arrondi du composant secondes.

Si le comptage avant le moment, lorsque le temps et l'heure finale sont égales, (atteindre 0,0), le résultat est livré avec une erreur de -1.

Quand je mis à jour votre code avec des impressions supplémentaires, cela a été montré:

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 

Donc, si le comptage utilisé par la différence entre les temps unix arrondis, les résultats sont corrects. Conclusion: L'erreur vient parfois avant l'équation, vient parfois après cela. Cela dépend de l'heure à laquelle ce script a été lancé. Si le comptage par les composants de données commence par une erreur, il nettoie après 0, 0. Si le comptage commence avec un résultat correct, alors les résultats commencent à apporter des résultats d'erreur. C'est pourquoi le zéro apparaît deux fois - au moment où le résultat change son statut précis.

+0

Merci! Même si je n'ai pas compris clairement votre explication (je suis un novice dans swift) Cela m'a beaucoup expliqué. Une dernière chose, que voulez-vous dire par arrondi fois unix? – Led

+0

après avoir lu votre explication à fond je l'ai eu. Merci! – Led

+0

Vous êtes les bienvenus. Les temps unix arrondis signifient des temps au format unix, qui viennent avec la valeur arrondie du temps unix claqué nettoyé de la partie décimale désordonnée, qui pourrait éventuellement causer une erreur dans le comptage. Par exemple. arrondir 1,459 serait 1, 1,668 => 2 etc. Peut-être, si le composant Calendrier traduit l'heure, il y a une partie de .2873 ... dedans, il compte comme une seconde entière. Donc en l'arrondissant nous nous débarrassons de cette erreur possible. – pedrouan