iOS - Как завершить долгий процесс в фоновом режиме - PullRequest
9 голосов
/ 01 ноября 2011

Мое приложение загружает видео в Facebook. Я хочу завершить загрузку в фоновом режиме, даже если нетерпеливый пользователь нажимает кнопку «Домой» во время загрузки.

После некоторого чтения я попробовал это:

     UIBackgroundTaskIdentifier bti = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
         [[UIApplication sharedApplication] endBackgroundTask:bti];
     }];

     [fb requestWithGraphPath:@"me/videos"
                    andParams:params
                andHttpMethod:@"POST"
                  andDelegate:self];

     [[UIApplication sharedApplication] endBackgroundTask:bti]; 

Работа выполняется методом запроса fb. Видео загружается в Facebook через http-соединение. Это работает нормально, но если вы создадите фоновое приложение, нажав кнопку «Домой» во время загрузки, загрузка будет приостановлена. Если на переднем плане приложение, загрузка возобновляется.

Я надеялся, что загрузка закончится в фоновом режиме.

Есть ли надежда заставить это работать? Я делаю что-то не так со всей вещью beginBackgroundTask? Это кажется слишком простым, чтобы работать таким образом, но это то, что, похоже, документы говорят.

Любая помощь, высоко ценится.

- Джон

Ответы [ 2 ]

15 голосов
/ 02 ноября 2011

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

Мой код выше выполняет код 'end' слишком рано, таким образом, почти немедленно заканчивая фоновое выполнение.

Способ сделать это - сделать что-то вроде:

   // make sure save can complete in the background
    if ([[UIDevice currentDevice] isMultitaskingSupported])
        backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}];

когда начинается длинное задание.Как сказано выше в hypercrypt, 'backgroundTaskID должен быть иваром или чем-то, что вы можете получить позже, когда длинная задача завершится.

Когда задача завершится, выполните что-то вроде:

if ([[UIDevice currentDevice] isMultitaskingSupported]) {
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
    backgroundTaskID = UIBackgroundTaskInvalid;
}

Это работает как шарм.

9 голосов
/ 01 ноября 2011

Вам необходимо позвонить [[UIApplication sharedApplication] endBackgroundTask:bti]; в обратном вызове делегата. Вам нужно будет хранить bti в ivar или как статическую переменную.

...