Mesurer le time avec précision dans Swift pour la comparaison entre les appareils

Je dois être en mesure d'save le time de réaction, à partir du moment où l'écran se charge ou l'label de question rafraîchit jusqu'à ce que l'user appuie sur un button numérique. Je ne trouve pas de documentation d'Apple sur ce sujet pour être très utile. NSDate n'est pas assez précis, j'ai besoin de mesurer en millisecondes au less. mach_absolute_time semble être favorisé par les concepteurs de jeux car il est cohérent en interne, mais cela ne fonctionnera pas pour cette application car j'ai besoin de comparer datatables entre les périphériques, et mach_absolute_time est time dépendant du processeur. Ce Q & A Apple Dev suggère d'utiliser NanosecondsToAbsolute et DurationToAbsolute mais c'est dans obj-c et je ne trouve pas de documentation équivalente rapide.

Y at-il une version rapide de NanosecondsToAbsolute et DurationToAbsolute que je ne trouve pas? Un autre moyen de le faire régulièrement?

Voici le code que j'essaye d'append les time à:

 class EmotionQuestionsViewController: UIViewController{ override func viewDidLoad() { super.viewDidLoad() //mark "startTime" when view loads } @IBOutlet var questionLabel: UILabel! var timeResultsStack = [Ssortingng]() var questionsStack = ["HAPPY", "ANXIOUS"] var questionResultsStack = [Ssortingng]() var questionStackArrayIndex = 1 @IBAction func RecordValueFromNumericalScaleOneToSeven(sender: UIButton) { //mark durration time as currentTime - startTime, append to timeResultsStack let value = sender.currentTitle! questionResultsStack.append(value) if questionResultsStack.count < questionsStack.count{ self.questionLabel.text = "how \(questionsStack[questionStackArrayIndex]) are you right now?" //mark startTime when label is changed self.questionStackArrayIndex++ } else{ self.performSegueWithIdentifier("showResults", sender: nil) } } 

Vous pouvez utiliser NSTimeInterval pour mesurer le time (bien mieux qu'une timer). Vous avez juste besoin de stocker deux dates (deux points dans le time) et soustraire endTime – StartTime comme suit:

 import UIKit class ViewController: UIViewController { @IBOutlet weak var salesPriceSlider: UISlider! var startTime: NSTimeInterval = 0 var endTime: NSTimeInterval = 0 override func viewDidLoad() { super.viewDidLoad() startTime = NSDate().timeIntervalSinceReferenceDate } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @IBAction func stopTimeAction(sender: AnyObject) { endTime = NSDate().timeIntervalSinceReferenceDate println((endTime-startTime).time) } } extension NSTimeInterval { var time: Ssortingng { return Ssortingng(format:"%d:%02d:%02d.%03d", Int(self/3600.0), Int(self/60.0 % 60), Int(self % 60), Int(self*1000 % 1000)) } } 

Comme déjà dit, la précision de NSDate() est probablement assez bonne pour votre but. Par souci d'exhaustivité, mach_absolute_time() du mach_absolute_time() technique référencé fonctionne également dans Swift:

 let t1 = mach_absolute_time() // do something let t2 = mach_absolute_time() let elapsed = t2 - t1 var timeBaseInfo = mach_timebase_info_data_t() mach_timebase_info(&timeBaseInfo) let elapsedNano = elapsed * UInt64(timeBaseInfo.numer) / UInt64(timeBaseInfo.denom); println(elapsedNano) 

Les avantages possibles de cette méthode:

  • L'appel de mach_absolute_time() semble être beaucoup plus rapide que d'appeler NSDate().timeIntervalSinceReferenceDate , donc cette méthode pourrait être mieux adaptée pour mesurer des intervalles extrêmement courts.
  • La valeur de NSDate() change si l'horloge est ajustée, mach_absolute_time() n'a pas ce problème.

NSDate est lié à l'horloge en time réel sur les appareils iOS et Mac et a une précision inférieure à la milliseconde.

Utilisez la méthode timeIntervalSinceReferenceDate de NSDate pour convertir un NSDate (ou l'heure actuelle) en un nombre de secondes égal au nombre de secondes écastings depuis le 1er janvier 2001, y compris les secondes fractionnaires. Une fois que vous faites cela, vous êtes libre de faire des calculs sur les doubles que vous obtenez.