2012-11-26 8 views
7

w mojej aplikacji Mam trochę NSOperacji, która aktualizuje niektóre podstawowe elementy danych z internetowej bazy danych, czasami aktualizacja wymaga jakiejś minuty, a gdy ekran blokady iPhone'a, aplikacja wchodzi w tryb tła, a ta aktualizacja jest zatrzymany, więc muszę ponownie otworzyć aplikację, aby kontynuować aktualizację, więc muszę szukać dużo na przepełnienie stosu i muszę znaleźć jakieś informacje na temat:Kontynuuj operację, gdy aplikacja wprowadziła tło na iOS

beginBackgroundTaskWithExpirationHandler 

że jest to metoda z jabłko, które pozwala kontynuować niektóre zadania także wtedy, gdy aplikacja jest w trybie tła, i mam to zrobić:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 

UIApplication *app = [UIApplication sharedApplication]; 
UIBackgroundTaskIdentifier bgTask; 

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
}]; 
} 

i teraz aplikacja kontynuuje zadanie w tle i wydaje się, że wszystko działa dobrze, więc moje pytanie brzmi, ta metoda, której używam jest bezpieczna? czy jest lepszy tryb?

dziękuję

+1

Sprawdź odpowiedź zamieszczoną tutaj .. http://stackoverflow.com/questions/12071726/how-to-use-beginbackgroundtaskwithexpirationhandler-for-already-running-task-in – iDev

Odpowiedz

12

Nie tak to robisz. Każdy kod, który chcesz uruchomić w tle, musi być odpowiednio opakowany. Coś takiego:

- (void)someMethodToKeepRunningInBackground { 
    UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) { 
     // Uh-oh - we took too long. Stop task. 
    }]; 

    // Perform task here   

    if (taskId != UIBackgroundTaskInvalid) { 
     [[UIApplication sharedApplication] endBackgroundTask:taskId]; 
    } 
} 

Niczego nie w metodzie UIApplicationDelegate applicationDidEnterBackground: zrobić.

Każde zadanie zawinięte w wywołania "zadania w tle" będzie mogło być kontynuowane, gdy aplikacja wejdzie w tło.

Oto naprawdę ważna część - zadanie zajmuje maksymalnie 10 minut. Jeśli nadal działa po 10 minutach, Twoja aplikacja zostanie zakończona. Procedura obsługi wygaśnięcia daje ci kilka sekund na zakończenie zadania, zanim aplikacja zostanie nieczytelnie zakończona.

+0

Tak, szukam w sieci, myślałem, że rozwiązaniem było to, że właśnie napisałeś, ale kod napisałem w moim pytaniu działa, nie wiem jak, ale jeśli zaczynam aktualizację, to naciśnij przycisk strony głównej, kiedy otworzę aplikację kilka minut później aktualizacja jest poprawnie ukończony, jak to wytłumaczyć? – Piero

+0

Kod, który wysłałeś, działa, ale marnuje zasoby. Jak napisano, twój kod informuje system operacyjny, że za każdym razem, gdy aplikacja wchodzi w tło, należy mu poświęcić 10 minut na pozostanie przy życiu w tle. A gdy skończy się czas, mówisz OS, aby zatrzymał aktywność w tle. Dzięki temu aplikacja działa aktywnie w tle przez 10 pełnych minut za każdym razem, gdy przechodzi w tło, bez względu na to, jak mało czasu zajmuje jej ukończenie. Twoja aplikacja bezużytecznie zabiera zasoby z innej aplikacji w tym czasie. Działa, ale to złe podejście. – rmaddy

+0

ok teraz rozumiem dziękuję, więc w każdej części kodu, który chcę (niekoniecznie w metodzie didenterbackground) używam kodu, który piszesz w rozwiązaniu, i muszę napisać kod, który trzeba wykonać również w trybie bacgkround po między zadaniem // Perferom tutaj a jeśli (taskId! = UIBackgroundTaskInvalid) .... prawda? – Piero

Powiązane problemy