¿Cómo descargar un archivo grande con el iPhone SDK y evitar problemas de uso de memoria?
-
05-07-2019 - |
Pregunta
Estoy usando la clase NSURLConnection
para descargar un archivo grande en mi aplicación de iPhone, pero se bloquea de vez en cuando porque está usando demasiada memoria. Estoy haciendo el uso habitual de NSURLConnection
, para adjuntar los datos recibidos a un objeto NSMutableData
.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.fileData appendData:data];
}
Luego, cuando termine de descargar el archivo completo, lo guardo en un archivo temporal local y lo leo como un archivo asignado como este:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
// save the downloaded data into a temporary file
NSString *tempPath = NSTemporaryDirectory();
NSString *tempFile = [tempPath stringByAppendingPathComponent:@"temp.pdf"];
[self.fileData writeToFile:tempFile atomically:YES];
NSData *mappedData = [NSData dataWithContentsOfMappedFile:tempFile];
NSURL *baseURL = [NSURL URLWithString:@"http://mydomain.com"];
[webView loadData:mappedData MIMEType:@"application/pdf" textEncodingName:@"UTF-8" baseURL:baseURL];
}
¿Qué puedo mejorar aquí para evitar estos problemas de uso de memoria?
Solución
Si es tan grande, ¿por qué no escribirlo en el archivo cuando entra, en lugar de mantenerlo en un objeto NSData?
Otros consejos
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse*)response {
filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:save_name]; // filename is in .h file
[[NSFileManager defaultManager] createFileAtPath:filename contents:nil attributes:nil];
file =
[[NSFileHandle fileHandleForUpdatingAtPath:filename] retain];// file is in .h
//if (file) {
//
// [file seekToEndOfFile];
// }
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSD
ata *)data {
if (file) {
[file seekToEndOfFile];
} [file writeData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection*)connection {
[file closeFile];
}
estoy usando
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:save_name];
NSFileHandle *file1 = [NSFileHandle fileHandleForUpdatingAtPath: filename];
[file1 writeData: data];
[file1 closeFile];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow