2013-05-09 12 views
17

Próbuję umieścić pasek postępu, który synchronizuje się podczas pobierania, które się dzieje. Moja aplikacja teraz można pobrać plik, używając przy tym kodów ...Cel C: Pobieranie pliku z paskiem postępu

pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://webaddress.com/pro/download/file.pdf"]]; 

    NSString *resourcePDFPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle] resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]]; 

    pdfFilePath = [resourcePDFPath stringByAppendingPathComponent:@"myPDF.pdf"]; 

    [pdfData writeToFile:pdfFilePath atomically:YES]; 

Podczas tego kodu aplikacja zatrzymana podczas pobierania, czy to normalne? Teraz chcę umieścić pasek postępu podczas tego czasu zatrzymania podczas pobierania.

Próbowałem zaglądać do kodów, które znalazłem w Internecie, ale jestem nieco zdezorientowany, myślę, że potrzebuję wyjaśnienia krok po kroku, dobrze wyjaśnionego.

Odpowiedz

59

Korzystanie AFNetworking,

tutaj postęp jest UIProgressview

#import <AFNetworking/AFNetworking.h>//add to the header of class 

-(void)downloadShowingProgress 
{ 
    progress.progress = 0.0; 

    [email protected]"http://www.selab.isti.cnr.it/ws-mate/example.pdf"; 


    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:currentURL]]; 
    AFURLConnectionOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"MY_FILENAME_WITH_EXTENTION.pdf"]; 
    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO]; 

    [operation setDownloadProgressBlock:^(NSUInteger bytesRead, NSUInteger totalBytesRead, NSUInteger totalBytesExpectedToRead) { 
     progress.progress = (float)totalBytesRead/totalBytesExpectedToRead; 

    }]; 

    [operation setCompletionBlock:^{ 
     NSLog(@"downloadComplete!"); 

    }]; 
    [operation start]; 

} 

Korzystanie z NSURLConnection

-(void)downloadWithNsurlconnection 
{ 

    NSURL *url = [NSURL URLWithString:currentURL]; 
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:url   cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 
    receivedData = [[NSMutableData alloc] initWithLength:0]; 
    NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self  startImmediately:YES]; 


} 


- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    progress.hidden = NO; 
    [receivedData setLength:0]; 
    expectedBytes = [response expectedContentLength]; 
} 

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [receivedData appendData:data]; 
    float progressive = (float)[receivedData length]/(float)expectedBytes; 
    [progress setProgress:progressive]; 


} 

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 

} 

- (NSCachedURLResponse *) connection:(NSURLConnection *)connection willCacheResponse: (NSCachedURLResponse *)cachedResponse { 
    return nil; 
} 

- (void) connectionDidFinishLoading:(NSURLConnection *)connection { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent:[currentURL stringByAppendingString:@".mp3"]]; 
    NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]); 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    [receivedData writeToFile:pdfPath atomically:YES]; 
    progress.hidden = YES; 
} 
+0

mówi AFURLConnectionOperation jest niezadeklarowanym identyfikatorem – SeongHo

+0

Edytowano odpowiedź.Aby dodać #import w nagłówku klasy –

+0

Próbowałem, ale go nie znaleziono. Z jakich ram należy skorzystać? – SeongHo

0

Obawiam się, że to nie jest normalne, użyj metody asynchronicznej, aby uzyskać NSData.

1

Użyj klasy ASIHTTPRequest.h i ASINetworkQueue.h, aby pobrać plik.

i użyć tego kodu na pasku postępu

request = [ASIHTTPRequest requestWithURL:@"http://webaddress.com/pro/download/file.pdf]; 
    [request setDelegate:self]; 
    [request setDownloadProgressDelegate:progressView]; 
    [request setShowAccurateProgress:YES]; 
    request.shouldContinueWhenAppEntersBackground=YES; 
    request.allowResumeForFileDownloads=YES; 
    [request startAsynchronous]; 

może to pomóc

+0

należy umieścić to w przycisk kliknięcia "Pobierz"? – SeongHo

+0

Tak, chcesz umieścić ten kod w funkcji przycisku kliknięcia ... – Nithinbemitk

0

Przede wszystkim powinno być jasne, czy dokonać połączenia synchroniczne i asynchroniczne. Do aplikacji mobilnych lub dowolnej innej aplikacji preferowana jest asynchroniczna.

Po wyczyszczeniu należy użyć klasy NSURLConnection do pobrania danych z adresu URL. Tutaj jest good tutorial.

W celu załadowania można rozpocząć postępy podczas uruchamiania żądania i zatrzymać je po otrzymaniu metody delegowania connection:didFailWithError: lub connectionDidFinishLoading:.

+0

Jak pobierać plik PDF synchronicznie za pomocą NSURLConnection w swift @Inder Kumar Rathore –