У меня есть некоторый длительный процесс, который я хочу запустить, даже если приложение идет в фоновом режиме. Я вызываю метод beginBackgroundTaskWithExpirationHandler:
приложения и в expirationBlock я вызываю приложение endBackgroundTask
. Вот реализация:beginBackgroundTaskWithExpirationHandler вызывает endBackgroundTask, но не завершает процесс
__block UIBackgroundTaskIdentifier task = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:task];
task = UIBackgroundTaskInvalid;
}];
dispatch_queue_t queue = dispatch_queue_create("com.test.test1234", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
// My Task goes here
});
В некоторых случаях мой серийный очереди больше задач на выполнение которых не может быть завершена в срок, предусмотренный системой. Таким образом, блок завершения истечет, и в этом я заканчиваю UIBackgroundTaskIdentifier
, но не останавливаю процесс отправки (я даже не могу отменить отправку).
документ от Apple говорит:
Каждый вызов beginBackgroundTaskWithName: expirationHandler: или beginBackgroundTaskWithExpirationHandler: метод генерирует уникальный ключ, который будет связан с соответствующей задачей. Когда ваше приложение завершает задачу, оно должно вызвать метод endBackgroundTask: с соответствующим токеном, чтобы система узнала, что задача завершена. Невозможность вызвать метод endBackgroundTask: для фоновой задачи приведет к прекращению действия вашего приложения. Если вы предоставили обработчик срока действия при запуске задачи, система вызывает этот обработчик и дает вам последний шанс прекратить выполнение задачи и избежать ее завершения.
Итак, в соответствии с этим, если я не звоню endBackgroundTask:
, мое приложение будет прекращено, что нормально.
Мой вопрос: с моей текущей реализацией что делать, если я вызываю endBackgroundTask:
в expirationHandler и моя задача очереди отправки не заполняется? Мое приложение будет прекращено или будет приостановлено?
благодаря
если вы вызвали endBackgroundTask: в любом месте вашей очереди. он просто приостановил ваше приложение, поставив приложение во сне. –
@chiragshah, так что это не может быть причиной сторожевого пса, чтобы убить мое приложение? watchdog убьет приложение, только если я пропущу «endBackgroundTask»? –
да, я тоже думаю, что в моем приложении он может нормально работать –