2012-06-20 18 views
6

Potrzebuję pobrać pliki> 500 Mo z AFNetworking. Czasami ich pobranie trwa> 10 minut, a jeśli aplikacja działa w tle, pobieranie nie może zostać ukończone.AFNetworking + duże pliki do pobrania + pliki do pobrania

Dlatego chcę wypróbować częściowe pliki do pobrania. Znalazłem wiele linków i wydaje się to możliwe dzięki metodom pause() i resume() w AFHTTPRequestOperation.

Właściwie zrobiłem:

[self.downloadOperation setShouldExecuteAsBackgroundTaskWithExpirationHandler:^{ 
    // Clean up anything that needs to be handled if the request times out 
    [self.downloadOperation pauseDownload]; 
    }]; 

DownloadOperation jest podklasą AFHTTPRequestOperation (singleton).

I AppDelegate:

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    // resume will only resume if it's paused... 
    [[DownloadHTTPRequestOperation sharedOperation] resumeDownload]; 
} 

Serwer jest OK, aby uzyskać nową serię w nagłówkach ...

Moje pytania:

1) IS-t dobry sposób to zrobić to ? 2) Czy wznowić musi zmienić outputStream (append: NO => append: YES)? A może jest on zarządzany gdzieś przez AFNetworking? (Nie znaleźć)

self.outputStream = [NSOutputStream outputStreamToFileAtPath:self.filePath append:YES]; 

coś takiego (w DownloadHTTPRequestOperation):

- (void)pauseDownload 
{ 
    NSLog(@"pause download"); 
    [self pause]; 
} 

- (void)resumeDownload 
{ 
    NSLog(@"resume download"); 
    self.outputStream = [NSOutputStream outputStreamToFileAtPath:self.filePath append:YES]; 
    [self resume]; 
} 

Dzięki za pomoc.

Odpowiedz

1

Skończyło się na używaniu starej (bez ARC) architektury ASIHTTPRequest dla podobnego zadania. AllowResumeForFileDownloads robi to, czego potrzebujesz. Zauważ, że serwer musi obsługiwać wznawianie, czytając nagłówek http Zakres.

if (![[NSFileManager defaultManager] fileExistsAtPath:downloadPath]){ 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request setAllowResumeForFileDownloads:YES]; 
    [request setDownloadDestinationPath:downloadPath]; 
    [request setTemporaryFileDownloadPath:tmpPath]; 
    [request startAsynchronous]; 
} 
+0

BTW AFNetworking jest także "non ARC" – pahan

+1

AFNetworking ARC jest teraz włączona. – tangqiaoboy

Powiązane problemy