Методы для предотвращения iOS NSTimers от фоновой гибели - PullRequest
2 голосов
/ 01 сентября 2011

Относительно плохо знаком с obj-c и iOS, но я создал небольшое приложение, построенное на 4 простых таймерах в стиле секундомера.Пользователь запускает таймер, он начинает считать, и они продолжают свою жизнь.Когда они открывают приложение, они могут видеть, как долго оно продолжается.По отдельности эти таймеры будут идентичны тайме в приложении Apple Clock.

Это работает "большую часть" времени.У меня были таймеры, работающие в течение нескольких дней, они запускались, останавливались, сбрасывались, запускались снова.Тем не менее, я заметил, что если приложение переместится немного вниз в ящик многозадачности, то в следующий раз, когда я открою приложение, все мои таймеры будут на нуле, и приложение будет в только что запущенном состоянии.

Мне кажется, это связано с тем, что ОС думает, что мое приложение не нужно, убивая его потоки / процессы / что угодно, чтобы освободить память.Для целевой аудитории приложений это будет часто проверяемое приложение, поэтому оно может не возникать как проблема, но, похоже, должен быть какой-то технический подход, чтобы гарантировать, что мои секундомеры никогда не выйдут из строя.Я просто не уверен, где искать такую ​​функциональность.Любые мысли приветствуются.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 01 сентября 2011

Вы делаете это неправильно.

Если вы создаете приложение для секундомера с 10 таймерами, вам нужен ровно один NSTimer.
И этот таймер обновляет дисплей.Этот таймер не нужен, когда приложение работает в фоновом режиме.

У NSTimers есть проблема, связанная с тем, что они могут опоздать, и их не следует использовать для планирования критических по времени вещей (например, для подсчета секунды).


Сохраните текущую NSDate при запуске таймера и отобразите разницу в приложении.

Сохраните эти NSDates в NSUserDefaults, и они даже выдержат перезапуск устройства.

2 голосов
/ 01 сентября 2011

Попробуйте этот подход: для ваших «таймеров» следите только за временем начала, и для целей отображения рассчитайте количество секунд с момента запуска и отобразите соответственно.

Сохраните это время запуска, чтобы, даже если приложение было «выселено», вы все равно будете знать, когда был запущен таймер, и сможете подсчитать, сколько времени прошло.

Единственная причина использовать NSTimer - это если вы хотите, чтобы время таймера показывало.

Также взгляните на методы делегатов applicationDidEnterBackground и applicationWillEnterForeground. В этих методах вы хотите сделать недействительным и восстановить NSTimer (если вы его используете), соответственно.

Существует много документации Apple о том, что вы можете и не можете делать в фоновом режиме здесь .

0 голосов
/ 01 сентября 2011

К сожалению, нет способа гарантировать, что ваше приложение будет продолжать работать в фоновом режиме так, как вы этого хотите.

Вы можете использовать -beginBackgroundTaskWithExpirationHandler:, чтобы запросить до десяти минут дополнительного времени выполнения, но, по всей вероятности, ваше приложение будет прекращено.

Я слышал, что инженер Apple называет это «выселением».

...