Отправка вызова в основную очередь внутри 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];        
    });
}

Итак, у меня есть два вопроса.

  1. Если мое приложение перейдет в фоновый режим во время некоторой обработки, что произойдет с вызовами dispatch_async для главной очереди?
  2. Это хороший дизайн?

1 ответ

Решение

В ответ на ваш вопрос, эти отправленные блоки в основную очередь работают так, как вы ожидаете, и все будет работать нормально, и когда приложение вернется на передний план, вы увидите, что пользовательский интерфейс обновлен должным образом. Два предостережения:

  1. Вы хотите убедиться, что endBackgroundTask не вызывается до окончательной отправки. Вы можете достичь этого одним из следующих способов:

    • Сделайте эту последнюю отправку интерфейса синхронной; или же

    • Включить endBackgroundTask как последний элемент в последнем блоке, который вы отправляете в основную очередь.

    Но время этого endBackgroundTask важно, вы хотите убедиться, что вы обновили свой пользовательский интерфейс, прежде чем пометить фоновую задачу как выполненную и указать, что она может быть приостановлена.

  2. Я не знаю, как вы хотите обработать сбой для завершения фоновой задачи, но в целом вы бы позвонили endBackgroundTask также в обработчике истечения срока действия, потому что в противном случае приложение будет кратко завершено, если фоновая задача не была выполнена за отведенное время. См. Пример " Выполнение задачи конечной длины" в разделе " Состояния приложений и многозадачность" Руководства по программированию приложений для iOS.

Другие вопросы по тегам