Если у нас есть долго выполняемая задача, мы можем гарантировать, что приложение не закроется, пока эта задача не будет завершена, используя следующий фрагмент кода:
UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
// Clean up any unfinished task business by marking where you.
// stopped or ending the task outright.
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
// Do the work associated with the task, preferably in chunks.
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
В моем случае, список приложений содержит запись для Application does not run in background
, установленную на YES
. Теперь у меня есть последовательная очередь (dispatch_queue_create(..., NULL)
), которая регистрирует операции и выполняет их одну за другой. Пользователь может публиковать много задач одновременно, и выполнение всех из них может занять пару секунд 20-30.
Теперь мой вопрос, могу ли я использовать beginBackgroundTaskWithExpirationHandler
с моей последовательной очередью? Если да, то какие-нибудь рекомендации относительно того, как? Я считаю, что мне придется поддерживать массив UIBackgroundTaskIdentifier
?