創建一個定時器不是昂貴的一個特點,但它仍然有點貴。
的好消息是,你可以任意更改消防日期:
[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秒)。
這不符合目的。我需要檢測3小時絕對沒有活動或移動。所以,即使最輕微的動作也需要使舊計時器失效並啓動另一個計時器。有關性能影響的任何想法? – 2010-09-24 19:59:57
看到我的新編輯 – 2010-09-24 20:38:01