准确快速地测量时间以便跨设备进行比较

我需要能够logging反应时间,从屏幕加载或问题标签刷新,直到用户点击一个数字button。 我没有find来自苹果的文件,这是非常有益的。 NSDate是不够准确的,我需要至less测量到毫秒。 mach_absolute_time似乎被游戏devise者青睐,因为它在内部是一致的,但它不适用于这个应用程序,因为我需要跨设备比较数据, mach_absolute_time是与CPU相关的时间。 这个Apple Dev Q&Abuild议使用NanosecondsToAbsoluteDurationToAbsolute但它在obj-c中,我无法find一个快速的等效文档。

是否有一个迅速版本的NanosecondsToAbsoluteDurationToAbsolute ,我只是没有find? 一些其他的方式来做到这一贯?

下面是我试图添加时间的代码:

 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) } } 

您可以使用NSTimeInterval来测量时间(比计时器好得多)。 您只需要存储两个date(两个时间点),然后减去endTime – StartTime,如下所示:

 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: String { return String(format:"%d:%02d:%02d.%03d", Int(self/3600.0), Int(self/60.0 % 60), Int(self % 60), Int(self*1000 % 1000)) } } 

如上所述, NSDate()的精度可能足够满足您的需求。 只是为了完整性,引用的Technical Q&A QA1398中的 mach_absolute_time() 也适用于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) 

这种方法的可能的优点:

  • 调用mach_absolute_time()似乎比调用NSDate().timeIntervalSinceReferenceDate 更快, NSDate().timeIntervalSinceReferenceDate ,所以这个方法可能更适合测量极短的时间间隔。
  • 如果调整时钟,则NSDate()的值会更改, mach_absolute_time()不存在此问题。

NSDate绑定到iOS和Mac设备上的实时时钟,并具有亚毫秒的精度。

使用NSDate的timeIntervalSinceReferenceDate方法将NSDate(或当前时间)转换为自2001年1月1日以来的秒数,包括小数秒。 一旦你这样做,你可以自由地在你找回的双打上进行math运算。