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