I need to be able to record reaction time, from when the screen loads or the question label refreshes until the user taps a number button. I'm not finding documentation from Apple on this to be very helpful. NSDate
is not accurate enough, I need to measure to milliseconds at least. mach_absolute_time
seems to be favored by game designers because it is internally consistent, but it won't work for this application because I need to compare data across devices, and mach_absolute_time
is CPU dependent time. This Apple Dev Q&A suggests using NanosecondsToAbsolute
and DurationToAbsolute
but it's in obj-c and I can't find a swift equivalent documentation.
Is there a swift version of NanosecondsToAbsolute
and DurationToAbsolute
that I'm just not finding? Some other way to do this consistently?
Here's the code I'm trying to add the times to:
class EmotionQuestionsViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
//mark "startTime" when view loads
}
@IBOutlet var questionLabel: UILabel!
var timeResultsStack = [String]()
var questionsStack = ["HAPPY", "ANXIOUS"]
var questionResultsStack = [String]()
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)
}
}
As already said, the precision of NSDate()
is probably good enough
for your purpose. Just for the sake of completeness, mach_absolute_time()
from the referenced Technical Q&A QA1398
works in Swift as well:
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);
print(elapsedNano)
Possible advantages of this method:
mach_absolute_time()
seems to be much faster than calling
NSDate().timeIntervalSinceReferenceDate
, so this method might be
better suited to measure extremely short intervals.NSDate()
changes if the clock is adjusted,
mach_absolute_time()
does not have this problem.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With