Comment télécharger un fichier volumineux avec le SDK iPhone et éviter les problèmes d'utilisation de la mémoire?

StackOverflow https://stackoverflow.com/questions/623735

Question

J'utilise la classe NSURLConnection pour télécharger un fichier volumineux dans mon application iPhone, mais il se bloque de temps en temps car il utilise trop de mémoire. Je fais l'usage habituel de NSURLConnection , pour ajouter les données reçues à un objet NSMutableData .

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.fileData appendData:data];
}

Puis, après avoir téléchargé l'intégralité du fichier, je l'enregistre dans un fichier temporaire local et le lit en tant que fichier mappé, comme suit:

- (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];
}

Que puis-je améliorer ici pour éviter ces problèmes d'utilisation de la mémoire?

Était-ce utile?

La solution

S'il est aussi volumineux, pourquoi ne pas l'écrire dans le fichier dès son arrivée, plutôt que de le conserver dans un objet NSData?

Autres conseils

- (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]; 

}

j'utilise

- (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];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top