iPhone SDKで大きなファイルをダウンロードし、メモリ使用の問題を回避する方法は?

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

質問

NSURLConnection クラスを使用して、iPhoneアプリケーションで大きなファイルをダウンロードしていますが、メモリを使いすぎているために頻繁にクラッシュします。受信したデータを NSMutableData オブジェクトに追加するために、通常の NSURLConnection を使用しています。

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

ファイル全体のダウンロードが完了したら、ローカルの一時ファイルに保存し、次のようにマップされたファイルとして読み取ります。

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

これらのメモリ使用量の問題を回避するためにここで何を改善できますか?

役に立ちましたか?

解決

それがそんなに大きい場合、NSDataオブジェクトに保存するのではなく、入ってくるときにファイルに書き込んでみませんか?

他のヒント

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

}

私は使用しています

- (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];
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top