Создать фоновый поток, который выполняет команду каждые 4 часа
Я пытаюсь выяснить, как использовать фоновый поток для выполнения команды когда-либо 4 часа.
Я никогда не создавал ничего подобного раньше, поэтому пока только читал об этом. Одна из вещей, которые я прочитал, это
"Потоки связывают физическую память и критические системные ресурсы"
Так что в этом случае было бы неплохо иметь этот поток, который проверяет время, затем выполняет мой метод... или есть лучший вариант, я читал о GCD (Grand Central Dispatch), но я не уверен, если это применимо как я думаю его больше для одновременных запросов? не то, что повторяется снова и снова, проверяя время..
Или, наконец, я что-то упустил, когда вы можете выполнять запрос каждые 4 часа?
Любая помощь будет принята с благодарностью.
2 ответа
Существует максимальное время, в течение которого разрешено запускать фоновые процессы (10 минут), что затруднит ваш подход. Ваша следующая лучшая попытка - рассчитать следующее событие, сохранив где-нибудь время. Затем, если приложение выполняется во время или после этого события, оно может выполнять любое действие, которое вы хотите.
Это может помочь: http://www.audacious-software.com/2011/01/ios-background-processing-limits/
Я думаю, что было бы хорошо использовать отметку времени и опубликовать уведомление о том, когда время достигнет часов с этого времени.
Многопоточность не является хорошим средством для этого, потому что, по сути, вы будете выполнять цикл в течение четырех часов, используя циклы часов. Благодаря магии операционных систем это не поглотит все ядро или что-нибудь глупое, однако оно будет непрерывно вычисляться, если его запускать. Это было бы огромной тратой ресурсов, поэтому не допускается. GCD не был предназначен для такого рода вещей. Он должен был обеспечить параллелизм, чтобы сгладить взаимодействие с пользовательским интерфейсом, а также более эффективно выполнять задачи, 4-часовой цикл был бы неэффективным. Думайте о параллельности как о инструменте для чего-то вроде возможности взаимодействовать с таблицей, когда ее содержимое загружается или изменяется. Блоки GCD делают это очень легко при правильном использовании. GCD и другие возможности многопоточности дают инструменты для выполнения вычислений в фоновом режиме, а также для взаимодействия с базами данных и обработки запросов без какого-либо влияния на работу пользователей. Многие люди, которые намного умнее меня, много писали о том, что такое многопоточность / многозадачность и для чего она нужна. В некотором смысле, отправка сообщения на какое-то время будет методом многозадачности без необходимости постоянно выполнять блоки через GCD, чтобы ожидать 4-часовой период времени, однако это возможно сделать. Вы можете выполнить блок, который отслеживает время меньше максимальной продолжительности жизни потоков, а затем, когда выполнение потоков заканчивается, отправьте его снова, пока не будет достигнуто желаемое время. Это плохой способ сделать это. Опубликовать уведомление в центр уведомлений, это легко и будет достигать вашей цели, не имея дело со сложностью многопоточности самостоятельно.
Вы можете опубликовать запрос на уведомление об изменении времени, и он вернет свою заметку, однако для этого необходимо, чтобы приложение было активным или находилось в фоновом режиме. Я не могу гарантировать, что ОС не убьет ваше приложение, однако, если оно работает тихо и тихо с небольшим объемом памяти в "фоновом" состоянии, запрос центра уведомлений останется активным и будет функционировать как задумано.