2013-03-07 2 views
9

Я работаю над приложением, в котором пользователь может записывать видео с помощью AVFoundation и отправлять на сервер видео максимальный размер до 15M, в зависимости от скорости интернета &, который может занять от От приблизительно 1 до 5 минут для передачи видео на сервер. Я передаю записанное видео на сервер в фоновом потоке, чтобы пользователь мог продолжить работу над другим приложением, пока видео загружается на сервер.Выполнение длительных задач в фоновом режиме IOS

При чтении документов Apple для implementing long running tasks in backround я вижу, что в фоновом режиме разрешено выполнять только несколько видов приложений.
, например.

audio-Приложение воспроизводит слышимый контент пользователю, находясь в фоновом режиме. (Этот контент включает потоковое аудио или видео содержимое с использованием AirPlay.)

Относится ли это к моему приложению также для выполнения задач в фоновом режиме? или мне нужно перенести видео на основной поток?

+0

ru собирается загрузить видеозапись в фоновом режиме? – Ganapathy

+0

Да, это то, что я делаю, потому что я упомянул, что хочу, чтобы пользователь продолжал делать другие вещи в форме во время записи видео. – nsgulliver

+0

Во время загрузки приложение ура будет на переднем плане (выполнить какую-то другую задачу) или оно войдет в фон полностью? – Ganapathy

ответ

13

NSOperationQueue - рекомендуемый способ выполнения многопоточных задач, чтобы избежать блокировки основной нити. Фоновый поток используется для задач, которые вы хотите выполнять, пока ваше приложение неактивно, например, показания GPS или потоковое аудио.

Если приложение работает на переднем плане, вам не нужна фоновая нить.

Для простых задач, вы можете добавить операцию в очередь с использованием блока:

NSOperationQueue* operationQueue = [[NSOperationQueue alloc] init]; 
[operationQueue addOperationWithBlock:^{ 
    // Perform long-running tasks without blocking main thread 
}]; 

Более подробную информацию о NSOperationQueue и how to use it.

Процесс загрузки будет продолжаться в фоновом режиме, но ваше приложение будет подлежит приостановке, и, следовательно, загрузка может быть отменена. Чтобы избежать этого, вы можете добавить следующий код приложения делегат сказать OS, когда приложение готово быть приостановлено:

- (void)applicationWillResignActive:(UIApplication *)application { 
    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 

     // Wait until the pending operations finish 
     [operationQueue waitUntilAllOperationsAreFinished]; 

     [application endBackgroundTask: bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 
} 
+0

означает, что если пользователь нажмет кнопку питания, а 'NSOperationQueue' продолжит выполнение своих задач? – nsgulliver

+0

См. Обновленный ответ, чтобы избежать приостановки приложения во время его неактивности. – redent84

+0

Добавить знак '*' в NSOperationQueue '*' operationQueue – Salim

4

Ваше требование имеет право работать в фоновом режиме. Вам не нужно регистрировать какие-либо фоновые режимы, поддерживаемые в информационном plist. Все, что вам нужно сделать, это когда приложение собирается зайти в фоновый режим, запросить дополнительное время с помощью фонового обработчика задач и выполнить свою задачу в этом блоке. Убедитесь, что вы остановили свой обработчик до 10 минут, чтобы не получить силу, прекращенную ОС.

Вы можете использовать приведенный ниже код от Apple.

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 
    // Clean up any unfinished task business by marking where you 
    // stopped or ending the task outright. 
    [application endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
}]; 

// Start the long-running task and return immediately. 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    // Do the work associated with the task, preferably in chunks. 

    [application endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
});} 
+0

из Apple Docs неясно, поэтому я спросил, я уже реализую свой процесс загрузки в фоновом потоке, и я уже многозадачность использую, вопрос в том, что это заставит мое приложение отклоняться, если оно работает уже в фоновом потоке? во-вторых, мое приложение может находиться в активном или неактивном состоянии, не имеет значения, потому что оно выполняет задачи в фоновом потоке. – nsgulliver

+1

@nsgulliver No. Apple не откажется, потому что вы загружаете с помощью обработчика фона. Все, что вам нужно сделать, это убедиться, что вы прекращаете работу обработчика до 10 минут времени, когда приложение может быть прервано операционной системой. Я сделал это в нескольких приложениях, и у меня не было проблем с Apple. – Ravi

5

От вашего ответа на Dwayne вам не нужно скачивать в фоновом режиме. Скорее всего, вам нужна ваша загрузка в другой поток (фоновый поток) рядом с основным потоком. Что-то подобное для GCD:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
//  Do you download here... 
    }); 
+0

это загрузка данных на сервер, и, моя забота заключается в том, что если интернет спустится и станет доступным после некоторого времени, возобновит ли он мои задачи? должен будет добавить задачи в NSOperationQueue, как я понимаю, и если они ждут, то может возобновиться? – nsgulliver

+1

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

+0

и каковы те библиотеки, которые имеют возможность возобновить, а какие нет? – nsgulliver

Смежные вопросы