2010-09-24 2 views
2

У меня есть требование в моем приложении, которое требует, чтобы я отображал какое-либо сообщение пользователю, если в приложении или ipad нет активности около 3 часов. Я рассмотрел решение о том, что NSTimer начнется с момента запуска. Если пользователь выполняет какое-либо действие, я аннулирую таймер и запускаю новый. Тем не менее, в приложении есть воспроизведение видео, и, насколько я знаю, пользователь может смотреть видео в течение примерно 3 часов и не выполнять никаких других действий в течение этого времени и все равно получит сообщение.NSTimer и акселерометр в iPhone/iPad

Таким образом, альтернативой является аннулирование и запуск таймера каждый раз, когда я обнаруживаю, что 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 микросекунд, что практически навсегда (1000 циклов часов!).

Если вы действительно беспокоитесь о накладных расходах, просто установите флажок «активность» каждый раз, когда что-то происходит, и используйте (например) 1-часовой таймер. Когда срабатывает таймер, сделайте что-то вроде if (activity) {counter = 0; activity = 0; } else { counter ++; if (counter == 3) { ... } }. Это спорный вопрос, является ли пара микросекунд здесь и там являются более дорогостоящими, чем таймер стрельбы каждый час, но они оба довольно незначительны.

проблема с большим размером заключается в том, что акселерометр питается и процессорное время (и для доставки обновлений требуется процессорное время). Установка updateInterval = 10 или около того уменьшит накладные расходы, и она ограничена разумным значением (около 1 с) ОС.

0

Apple, имеет функцию в многозадачности, что они называют «Задача окончания» использование - (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void(^)(void))handler Найдено here и больше материала here

+0

Это не послужило бы целью. Мне нужно обнаружить 3 часа абсолютно никакой активности или движения. Таким образом, даже малейшее движение должно аннулировать старый таймер и запустить другой таймер. Любая идея о влиянии производительности? –

+0

Просмотреть мое новое редактирование –

0

Не можете ли вы просто отправить сообщение на ваш NSTimer всякий раз, когда начинается видео, чтобы аннулировать таймер? Затем, когда фильм заканчивается, запустите таймер.