كيفية تحميل ملف كبير مع SDK فون وتجنب المشاكل استخدام الذاكرة؟

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

سؤال

وأنا باستخدام فئة NSURLConnection لتحميل ملف كبير في بلدي تطبيق اي فون، لكنه تحطم بين الحين والآخر لأنها تستخدم الكثير من الذاكرة. أفعله استخدام NSURLConnection المعتاد، لإلحاق البيانات الواردة إلى كائن NSMutableData.

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