Отправка вызова в основную очередь внутри UIBackgroundTaskIdentifier
Я выполняю определенную задачу под UIBackgroundTaskIdentifier
так как я хочу запустить его в фоновом режиме. Мой код выглядит примерно так.
-(void) function
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIBackgroundTaskIdentifier BGIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}];
// some processing
dispatch_async(dispatch_get_main_queue(), ^{
// some UI stuff
});
// some processing again
dispatch_async(dispatch_get_main_queue(), ^{
// some UI stuff again
});
[[UIApplication sharedApplication] endBackgroundTask:BGIdentifier];
});
}
Итак, у меня есть два вопроса.
- Если мое приложение перейдет в фоновый режим во время некоторой обработки, что произойдет с вызовами dispatch_async для главной очереди?
- Это хороший дизайн?
1 ответ
В ответ на ваш вопрос, эти отправленные блоки в основную очередь работают так, как вы ожидаете, и все будет работать нормально, и когда приложение вернется на передний план, вы увидите, что пользовательский интерфейс обновлен должным образом. Два предостережения:
Вы хотите убедиться, что
endBackgroundTask
не вызывается до окончательной отправки. Вы можете достичь этого одним из следующих способов:Сделайте эту последнюю отправку интерфейса синхронной; или же
Включить
endBackgroundTask
как последний элемент в последнем блоке, который вы отправляете в основную очередь.
Но время этого
endBackgroundTask
важно, вы хотите убедиться, что вы обновили свой пользовательский интерфейс, прежде чем пометить фоновую задачу как выполненную и указать, что она может быть приостановлена.Я не знаю, как вы хотите обработать сбой для завершения фоновой задачи, но в целом вы бы позвонили
endBackgroundTask
также в обработчике истечения срока действия, потому что в противном случае приложение будет кратко завершено, если фоновая задача не была выполнена за отведенное время. См. Пример " Выполнение задачи конечной длины" в разделе " Состояния приложений и многозадачность" Руководства по программированию приложений для iOS.