2013-07-05 149 views
2

一個相對簡單的問題,我一直無法找到明確的答案。我的應用程序更復雜,但回答這個問題就足夠了。iOS阻止日期/時間更新?

假設您正在編寫秒錶應用程序。當用戶點擊「開始」,應用商店當前的日期和時間開始時間:

startTime = [NSDate date]; 

當用戶帶「停止」,該應用商店當前的日期和時間,停止時間:

stopTime = [NSDate date]; 

持續時間的計算方法是:

duration = [stopTime timeIntervalSinceDate:startTime]; 

,並顯示的東西,如:

[durationLabel setText:[NSString stringWithFormat:@"%1.2f", duration]]; 

我的應用程序的時間範圍從2到50秒的典型持續時間。我需要精確到1/100秒(例如2.86秒)。

我假設有一些協議,iOS設備用來保持其時鐘精確(蜂窩或NTP源?)。我擔心的是,在啓動和停止秒錶之間,iOS設備上的時鐘會更新,這會導致當前日期/時間向前或向後移動。如果發生這種情況,計算的持續時間將不準確。

爲了提高代碼效率,我見過幾個與時間方法有關的帖子。有些人建議使用我不熟悉的mach_time.h函數。對我來說哪一個是最好的方法並不明顯。

是否有可能禁用iOS更新日期&時間? mach_absolute_time()不受iOS時鐘更新的影響嗎?

非常感謝!

回答

1

您正確地認爲CFAbsoluteTime及其衍生產品(NSDate date等)可能在'真實'時間被網絡更新偏移。再加上NSTimer的準確度爲50-100毫秒,並且你有一個不適合最關鍵的時間敏感操作的計時器。

這個問題的答案似乎是CACurrentMediaTime。 它是Core Animation組的成員,但將它集成到基於非動畫的應用程序中應該沒有任何問題。

CACurrentMediaTime是mach_absolute_time()的一個包裝,並且理解了「mach絕對時間單位」,根據我的理解,這並不是一件好玩的事情。 mach_absolute_time()通過在設備上次啓動後運行非網絡同步計時器來計算。

上有CACurrentMediaTime信息相對較少,但這裏有一些消息來源和進一步閱讀:

注:如果您使用CACurrentMediaTime,請確保您有和鏈接QuartzCore.framework的鏈接文件

+0

這非常有幫助。我會仔細看看CACurrentMediaTime。 – Tim123

0

退房this here。我會說忘記當前時間檢查並使用精度計時器,因爲它不會依賴當前時間,而是使用間隔。

+0

感謝。看起來更像是定時器(例如,在將來的某個精確時間調用方法)。對於我的類似秒錶的應用,我只想記下一個開始時間(用戶點擊一個按鈕),一個停止時間(同時用戶點擊一個按鈕),然後計算並顯示持續時間。不需要NSTimer或文檔中描述的更精確的時序方法。但我很高興知道這是爲了將來的需求,所以再次感謝您的答覆。 – Tim123