2011-10-31 15 views
9

Moja aplikacja przesyła wideo na Facebooka. Chciałbym zakończyć przesyłanie w tle, nawet jeśli niecierpliwy użytkownik kliknie przycisk Strona główna podczas przesyłania.iOS - jak ukończyć długi proces w tle

Po pewnym czytania, to próbowałem:

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

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

    [[UIApplication sharedApplication] endBackgroundTask:bti]; 

Praca odbywa się metodą żądanie fb. Wideo jest przesyłane do Facebooka przez połączenie http. Działa to dobrze, ale jeśli tworzysz aplikację w tle, klikając przycisk Strona główna podczas przesyłania, przesyłanie jest zawieszone. Jeśli wybierzesz aplikację na pierwszym planie, przesyłanie zostanie wznowione.

Miałem nadzieję, że to się stanie, że ładowanie zakończy się w tle.

Czy jest jakaś nadzieja, że ​​to zadziała? Czy robię coś złego z całą kwestią beginBackgroundTask? Wydaje się to zbyt proste, aby pracować w ten sposób, ale tak mówią doktorzy.

Każda pomoc, bardzo doceniane.

- John

+0

@jhon muszę przesyłać filmy w tle. Czy mogę to zrobić pozwania tego bloku kodu? jest jakakolwiek szansa, że ​​jabłko może odrzucić moją aplikację, ponieważ wykonywanie długiego procesu w tle ma ograniczenia –

Odpowiedz

9

Trzeba zadzwonić [[UIApplication sharedApplication] endBackgroundTask:bti]; w zwrotnego delegata. Będziesz musiał przechowywać bti w zmiennej ivar lub statycznej.

+0

Dzięki za postawienie mnie na właściwej drodze. Dostarczyłem bardziej szczegółową odpowiedź tym, którzy mogą mieć z tym problemy. – John

15

Dobra, wymyśliłem to. Musisz wykonać kod "rozpocznij" na początku długiego zadania, które chcesz ukończyć w tle, nawet po wyjściu aplikacji, a następnie wykonać kod "zakończenia" po zakończeniu zadania.

Powyższy kod wykonuje zbyt wcześnie kod "zakończenia", co niemal natychmiast kończy wykonywanie tła.

Sposobem na to jest zrobić coś takiego:

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

kiedy zaczyna się czasochłonne zadanie. Jak mówi powyższy hypercrypt, "backgroundTaskID musi być ivar lub czymś, co można uzyskać później, po zakończeniu długiego zadania.

Po zakończeniu zadania, wykonać coś takiego:

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

To działa jak czar.

+2

John - Czy zdejmujesz nitkę i wkładasz to wszystko do wątku, czy czekasz na sygnał z nowego wątku, a następnie wywołujesz EndBackgroundTask w głównym wątku? – Chris

+1

@ Chris Myślę, że dobrze byłoby umieścić proces na nowym wątku. Jeśli musisz to zrobić w tle, prawdopodobnie jest to długie i skomplikowane zadanie, które powinno zostać wykonane na innym wątku, aby uniknąć zapychania interfejsu użytkownika. –