Swift temps en millisecondes
Je veux changer la minuterie à chaque milliseconde, mais il ne fonctionne pas comme prévu.
NSTimer.scheduledTimerWithTimeInterval(0.001, target: self, selector: Selector("advanceTimer:"), userInfo: nil, repeats: true);
func advanceTimer(timer: NSTimer){
self.time += 0.001;
let milliseconds = self.time * 100;
let remaingMilliseconds = Int((milliseconds % 1000) / 10);
let seconds = Int((milliseconds / 1000) % 60)
let strSeconds = String(format: "%02d", seconds)
let strFraction = String(format: "%02d", remaingMilliseconds)
timerText.text = "\(strSeconds):\(strFraction)";
}
Le résultat est
La minuterie changement jusqu'à 100 dans l'ordre de la milliseconde partie (00:100) et ensuite modifier à 01:00 = 40 secondes
Duncan approche:
var time: NSTimeInterval = 0;
var startTime: NSTimeInterval = 0;
//And your timer method...
func advanceTimer(timer: NSTimer){
//Total time since timer started, in seconds
self.time = NSDate.timeIntervalSinceReferenceDate() - startTime
println(self.time);
//The rest of your code goes here
}
override func didMoveToView(view: SKView) {
//Set anchor point
self.anchorPoint = CGPointMake(0.5, 0.5);
var startTime: NSTimeInterval
//Sart the timer
startTime = NSDate.timeIntervalSinceReferenceDate()
NSTimer.scheduledTimerWithTimeInterval(0.02,
target: self,
selector: Selector("advanceTimer:"),
userInfo: nil,
repeats: true)
}
Résultat: 456680125.54539 la première impression
- Le code semble bon, alors le problème doit être dans votre expectactions. Qu'attendez-vous le code pour le faire? Je suppose que la minuterie se développe plus lentement que vous attendez?
- La résolution de NSTimer est limitée à 50 à 100 millisecondes. Comparer par exemple les stackoverflow.com/questions/30945310/.... – Votre description du problème "il ne fonctionne pas comme prévu" n'est pas utile à tous.
- Regarde dans CADisplayLink si vous avez seulement besoin de faire des mises à jour de l'INTERFACE utilisateur en raison de la minuterie de cuisson.
- Une inqualifiable "Ça ne marche pas" est probablement moins mon préféré chose à lire dans une SORTE de question. Il est difficile d'obtenir le MOINS utile que ça.
- J'ai modifier la question
- Votre temps de calculs semblent être mauvais (pourquoi multiplier par 100??). Vous devriez vérifier quelques exemples avec un "papier et crayon" de calcul. Notez également que vous avez besoin de trois chiffres après la virgule à afficher les millisecondes.
- stackoverflow.com/a/30653322/2303865
- Dans votre "Duncan" approche de code, vous disposez de 2 variables
startTime
, l'un à portée mondiale et une à l'intérieur de votredidMoveToView()
fonction. C'est faux. se débarrasser de la variable localestartTime
à l'intérieur dedidMoveToView()
.
Vous devez vous connecter pour publier un commentaire.
Comme Martin l'a dit dans son commentaire, des minuteries ont une résolution de 50 à 100 ms (de 0,05 à 0,1 seconde). En essayant de lancer un chronomètre avec un intervalle plus court que celui qui ne donnera pas de résultats fiables. Aussi, les compteurs ne sont pas en temps réel. Ils dépendent de l'exécution de la boucle, elles sont attachées, et si la boucle est occupé, le tir de la minuterie obtient des retards.
Au lieu d'essayer d'incrémenter un compteur à chaque fois que votre compte à rebours incendies, enregistrer l'heure de début lorsque vous lancez le compte à rebours, puis faire quelques calculs pour savoir combien de temps s'est passé:
EDIT:
La Swift 3 version de ce code ressemble à ceci:
(Écrit comme un point de vue contrôleur dans un projet de test)