2011-01-02 21 views
7

Hej! Muszę wiedzieć, jak mogę uruchomić aplikację na iOS w tle aplikacji (np. Pobierz plik w pliku AppDelegate), więc zmiana kontrolerów ViewControllers nie spowoduje przerwania pobierania. Muszę też móc uzyskać postęp pobierania (0.00000 - 1.00000), aby ustawić obiekt UIProgressView, co oznacza również, że potrzebuję funkcji - (void)progressDidChangeTo:(int)progress.Pobieranie aplikacji w tle iOS

Odpowiedz

18

Wystarczy użyć ASIHTTPRequest to sposób łatwiejszy niż NSURLRequest i robi dokładnie to, czego potrzebujesz. To examples pokazuje, jak pobrać w tle i jak zgłaszać postęp.

Nie pobrałbym niczego bezpośrednio w AppDelegate. Zamiast tego utworzyłbym oddzielną klasę właśnie w tym celu. Nazwijmy to: MyService Chciałbym zainicjować tę klasę w moim delegacie aplikacji.

Ta klasa może działać jako singleton lub może zostać przekazana do każdego kontrolera widoku, który tego wymaga.

W klasie MyService dodałbym ASINetworkQueue i kilka metod obsługi żądań, gdy są gotowe. Oto kod z przykładów ASI, których można użyć:

- (IBAction)startBackgroundDownloading:(id)sender 
{ 
    if (!self.queue) { 
     self.queue = [[[ASINetworkQueue alloc] init] autorelease]; 
    } 

    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request setDidFinishSelector:@selector(requestDone:)]; 
    [request setDidFailSelector:@selector(requestWentWrong:)]; 
    [self.queue addOperation:request]; //queue is an NSOperationQueue 
    [self.queue go]; 
} 

- (void)requestDone:(ASIHTTPRequest *)request 
{ 
    NSString *response = [request responseString]; 
    //Do something useful with the content of that request. 
} 

- (void)requestWentWrong:(ASIHTTPRequest *)request 
{ 
    NSError *error = [request error]; 
} 

Jeśli musisz ustawić pasek postępu. Chciałbym po prostu wystawiać setDownloadProgressDelegate z ASINetworkQueue w mojej klasie MojaUsluga i ustawić go w moich ViewControllers tak:

[[MyService service] setDownloadProgressDelegate: self.myUIProgressView]; 

BTW. Jeśli chcesz kontynuować pobieranie nawet po wyjściu z aplikacji, możesz ustawić właściwość swojej prośby na TAK na ShouldContinueWhenAppEntersBackground.

+0

... Jestem. Potrzebuję pobierania w pliku AppDelegate, aby pobieranie nie zakończyło się, gdy uruchamiany jest UIViewController, który go zainicjował. Muszę wiedzieć, w jaki sposób można uzyskać UIViewController, aby uruchomić i uzyskać dostęp do obiektu ASIHTTPRequest, ale mają obiekt zatrzymany w AppDelegate. –

+0

@ hankweb, właśnie zaktualizowałem swoją odpowiedź. –

+0

Problem polega na tym, że reportFailure będzie wywoływany w ASIHTTPRequest.m za każdym razem, gdy moja aplikacja wróci z tła. Używam w taki sam sposób, jak zasugerowałeś w poście, a obiekt ShouldContineWhenAppEntersBackground ma wartość TAK. –

3

można użyć NSURLConnection, aby uruchomić asynchroniczne żądanie, które nie spowoduje zablokowania interfejsu użytkownika. Można to zrobić wykonując coś takiego:

NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url]; 
connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 
[urlRequest release]; 

, aby mieć swoje postępy można użyć:

connection:didReceiveResponse:(NSURLResponse *)response; 

delegata wezwanie do wglądu response.expectedContentLength a następnie użyć

connection:didReceiveData:(NSData *)data 

, aby śledzić ilość pobranych danych i obliczyć procent.

Nadzieja to pomaga, Moszi

+0

Mam część pobierania w dół, przy użyciu ASIHTTPRequest, po prostu muszę wiedzieć, jak zaimplementować pobieranie, aby rozpocząć w tle, zamiast bieżącego otwarty UIViewController, więc gdy kontroler widoku zostanie zwolniony, pobieranie będzie kontynuowane. –

+0

Można utworzyć klasę singleton do zarządzania pobieraniem, w ten sposób klasa ta będzie dostępna nawet wtedy, gdy kontroler widoku zostanie zwolniony. (wzór singletonowy na wikipedia: http://en.wikipedia.org/wiki/Singleton_pattern) – Moszi

Powiązane problemy