2012-02-06 12 views
18

Szukałem dosłownie tygodni, aby znaleźć odpowiedź lub przykład, jak to zrobić.W jaki sposób połączenie nawiązane z NSURLConnection na pierwszym planie może być kontynuowane w tle?

Wszystkie przykłady/samouczki dla NSURLConnection pokazują, że zaczyna się na pierwszym planie lub zaczyna się w tle, tak samo wszystkie przykłady dla beginBackgrounTaskWithExpirationHandler: pokaż, jak uruchomić zadanie w tle po wprowadzeniu tła.

O ile mogę powiedzieć, nie ma nic w Internecie lub książek, które pokazują, jak rozpocząć połączenie, gdy na pierwszym planie, a następnie, jeśli nie jest zakończony, kontynuuj go w tle.

Odpowiedź na to pytanie nie jest właściwie odpowiedzieć na pytanie:

How should beginbackgroundtaskwithexpirationhandler: be dealt with for an NSUrlConnection that is already in progress?

Jeśli czytasz referened Beyond sekcji Basics to mówi: „Podczas gdy aplikacja jest na pierwszym planie zadanie tło wygrał” mieć żadnego efektu ". Oznacza to, że nie można rozpocząć zadania w tle za pomocą NSURLConnection na pierwszym planie, jeśli chcesz pobrać na pierwszym planie.

+0

Dokument mówi „Podczas gdy aplikacja jest na pierwszym planie zadanie tła nie będzie miało żadnego wpływu, jednakże , jeśli użytkownik przeniesie aplikację na miejsce, istnienie zadania w tle automatycznie zatrzyma działanie aplikacji, aby mogła zakończyć operację. " To ma dla mnie sens, ponieważ zadanie w tle powinno działać - po uruchomieniu zadania (np. Pobranie pliku) na pierwszym planie, jeśli aplikacja wejdzie w tło, zakończy zadanie pobierania bez przerywania połączenia sieciowego . – sbs

Odpowiedz

38

Wystarczy zadzwonić beginBackgroundTaskWithExpirationHandler:podczas aplikacja jest na pierwszym planie po prawej rozpocząć proces pobierania. Pamiętaj, że masz do przechowywania wartości zwracanej w Ivar/nieruchomość:

@property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskID; 

@synthesize backgroundTaskID; 

... 

NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
self.backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
    // Cancel the connection 
    [connection cancel]; 
}]; 

Pozwoli to aplikacja biec jeśli zostanie wysłany na tle podczas pobierania jest uruchomiony. Następnie, w swoich metodach powierzyć to oznaczać zakończenie pobierania, trzeba umieścić pasujący endBackgroundTask::

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    // Handle the error 
    ... 

    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskID]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // Save the downloaded data 
    ... 

    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskID]; 
} 
+0

właśnie wypróbowałem tę metodę, działa jak urok z NSURLConnection! dzięki! – sbs

+0

Zauważ, że w dzisiejszych czasach ta metoda działa przez 3 minuty w tle od czasu iOS 7, czy istnieje sposób na utrzymanie jej przy życiu? – CGR

Powiązane problemy