2012-08-29 22 views
6

Potrzebuję pobrać duże pliki .zip (do 800 MB) z moją aplikacją na iPada. Chcę wznowić pobieranie ponownie, jeśli zostało anulowane lub aplikacja jest w tle.AFNetworking + Pauza/Wznów pobieranie dużych plików

operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:YES]; 

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){ 

// unzip the .zip 


}failure:^(AFHTTPRequestOperation *operation, NSError *error){ 

//Handle the error 

}]; 


[operation setDownloadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten,long long totalBytesExpectedToWrite) { 

//update the progressView 

}]; 

[operation setShouldExecuteAsBackgroundTaskWithExpirationHandler:^{ 

// What I have to do here? 

}]; 

[operation start]; 
[operation waitUntilFinished]; 


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

// What I have to do here? 

} 

Dzięki za pomoc.

Odpowiedz

23

Możesz użyć AFDownloadRequestOperation, aby to zrobić.

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"....zip"]]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"....zip"]; 
    AFDownloadRequestOperation *operation = [[AFDownloadRequestOperation alloc] initWithRequest:request targetPath:path shouldResume:YES]; 
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"Successfully downloaded file to %@", path); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
    }]; 
    [operation setProgressiveDownloadProgressBlock:^(NSInteger bytesRead, long long totalBytesRead, long long totalBytesExpected, long long totalBytesReadForFile, long long totalBytesExpectedToReadForFile) { 
     NSLog(@"Operation%i: bytesRead: %d", 1, bytesRead); 
     NSLog(@"Operation%i: totalBytesRead: %lld", 1, totalBytesRead); 
     NSLog(@"Operation%i: totalBytesExpected: %lld", 1, totalBytesExpected); 
     NSLog(@"Operation%i: totalBytesReadForFile: %lld", 1, totalBytesReadForFile); 
     NSLog(@"Operation%i: totalBytesExpectedToReadForFile: %lld", 1, totalBytesExpectedToReadForFile); 
    }]; 
    [operations addObject:operation]; 

Po ponownym uruchomieniu aplikacji i wygenerowaniu żądania o tym samym adresie URL zostanie wznowione pobieranie. "shouldResume: YES" works

+1

Czy istnieje alternatywa bez ARC? – Tudorizer

+0

Czy wiesz, czy działa to w przypadku przekierowania adresu URL? Przygotowałem adresy URL, które następnie przekierowują do rzeczywistego pliku do pobrania. Pobieranie nie wydaje się być wznawianie za pomocą tych adresów URL. –

+0

Upewnij się, że za każdym razem określasz tę samą ścieżkę docelową. Również nie może być katalogiem; jeśli określisz katalog, użyje adresu URL do nazwania pliku. – mrgrieves