2010-09-24 57 views
2

我的應用程序中有一個需求,如果應用程序/ iPad上沒有發生約3小時的活動,我需要向用戶顯示一些消息。 我認爲有一個NSTimer將在啓動時開始的解決方案。如果用戶執行任何操作,我將使計時器無效並啓動一個新計時器。但是,應用程序上有視頻回放,就我所知,用戶可能正在觀看視頻約3小時,並且在此期間不會執行其他操作,並且仍會收到該消息。在iPhone/iPad的NSTimer和加速度計

所以,另一種方法是無效,每次檢測到ipad/iphone移動時啓動計時器。換句話說,使用加速度計並在回調中檢測加速度,我可以使無效並再次創建計時器。 但我擔心這種方法即使對於最小的運動,定時器也必須失效並重新創建。這種方法會不會影響性能?

感謝和問候, hetal

回答

0

創建一個定時器不昂貴的一個特點,但它仍然有點貴。

的好消息是,你可以任意更改消防日期:

[timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:3*60*60]]; 

或者,非常輕微更少的開銷:

CFRunLoopTimerSetNextFireDate((CFRunLoopTimerRef)timer, CFAbsoluteTimeGetCurrent()+3*60*60); 

(我認爲CFAbsoluteTimeGetCurrent()開銷超過目標創造的開銷,但是meh。)

稍好的解決方案可能是離開計時器大部分時間都在;只需更新「上次活動」時間戳即可。計時器觸發時,請查看「上次活動」時間戳。如果超過3小時前,則顯示通知。如果小於3小時前,則適當設置下一個啓動日期;這意味着計時器最多每1.5小時觸發一次(平均),這可能是可能是並不像重複更改啓動日期那樣昂貴。

請參閱mach_absolute_time()瞭解相對較低的開銷時基(預先計算以mach_absolute_time爲單位的3小時)。它仍然需要大約3微秒,這實際上是永遠(1000個時鐘週期!)。

如果你是真的擔心開銷,每次發生事情時只需設置一個「活動」標誌,並使用(例如)1小時定時器。當定時器啓動時,請執行類似if (activity) {counter = 0; activity = 0; } else { counter ++; if (counter == 3) { ... } }的操作。在這裏和那裏幾微秒是否比每小時發射一次計時器更昂貴是值得商榷的,但它們都很微不足道。

更大的問題是加速度計吃電源和CPU時間(並提供更新需要CPU時間)。設置爲updateInterval = 10左右會降低開銷,並且操作系統將其限制在一個合理的值(大約1秒)。

0

蘋果公司在多任務,他們稱之爲「任務完成」的- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void(^)(void))handler 使用中發現here和更多的東西here

+0

這不符合目的。我需要檢測3小時絕對沒有活動或移動。所以,即使最輕微的動作也需要使舊計時器失效並啓動另一個計時器。有關性能影響的任何想法? – 2010-09-24 19:59:57

+0

看到我的新編輯 – 2010-09-24 20:38:01

0

無論何時視頻啓動,您都不能只發送消息給NSTimer,以使計時器失效嗎?然後當電影結束時,啓動計時器備份。