在Swift中准确测量时间以进行设备比较

Lau*_*n G 4 time ios swift

我需要能够记录反应时间,从屏幕加载或问题标签刷新到用户点击数字按钮.我没有找到Apple提供的文档,对此非常有帮助.NSDate不够准确,我需要至少测量到几毫秒.mach_absolute_time似乎受到游戏设计师的青睐,因为它在内部是一致的,但它不适用于这个应用程序,因为我需要跨设备比较数据,并且mach_absolute_time是CPU相关的时间.Apple Dev Q&A建议使用NanosecondsToAbsolute,DurationToAbsolute但它在obj-c中,我找不到快速的等效文档.

是否有一个快速的版本NanosecondsToAbsolute,并DurationToAbsolute说我只是没有找到?还有其他一些方法吗?

这是我试图将时间添加到的代码:

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)

        }
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 16

如前所述,精度NSDate()可能足以达到您的目的.仅仅为了完整起见,mach_absolute_time()引用的 技术问答QA1398也 适用于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);
print(elapsedNano)
Run Code Online (Sandbox Code Playgroud)

这种方法的可能优点:

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