У меня есть какой-то длительный процесс, который я хочу запустить, даже если приложение работает в фоновом режиме. Я вызываю метод приложения beginBackgroundTaskWithExpirationHandler:
, а в блоке expireBlock я вызываю приложение 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:
в блоке expireHandler, и задача моей очереди отправки не будет завершена? Мое приложение будет прекращено или будет приостановлено?
Благодарность
endBackgroundTask
, верно? - person Kapil Choubisa   schedule 28.04.2015