内存压力下载许多图像

时间:2014-03-27 22:03:56

标签: ios xcode image memory download

我正在尝试从服务器下载数千张图片(每张最多350 Kb),但是我收到了超过一千张图片,我收到了警报" Memory Presure"。

基本上我有一个包含图像所有名称的数组,并做一个循环,像这样一对一:

for (int x=0; x<unique.count; x++) {

     NSURL *ImageLink = [NSURL URLWithString:[NSString stringWithFormat:@"http://urltoimagesfolder.com/", [unique objectAtIndex:x]]];
     NSData *data = [NSData dataWithContentsOfURL:ImageLink];
     UIImage *img = [[UIImage alloc] initWithData:data];

     if (data.length !=0) {

     NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[unique objectAtIndex:x]]; //add our image to the path

     [UIImageJPEGRepresentation(img, 1.0) writeToFile:fullPath atomically:YES];

     //[self saveImage:img :NombreFoto];
     //[self Miniatura:img :[NSString stringWithFormat:@"mini-%@", [unique objectAtIndex:x]]];
     }

    data = nil;
    img = nil;


}

问题:如何在内存压力下没有应用程序崩溃的情况下下载所有图像?

1 个答案:

答案 0 :(得分:0)

UIImageJPEGRepresentation()可能导致内存溢出。 但是您不需要使用该功能,您可以通过向writeToFile:对象发送消息data来检查接收的数据是否为image并将其字节直接写入磁盘。

您可以修改这样的代码:

for (int x=0; x<unique.count; x++) {
     NSURL *ImageLink = [NSURL URLWithString:[NSString stringWithFormat:@"http://urltoimagesfolder.com/", [unique objectAtIndex:x]]];
     NSData *data = [NSData dataWithContentsOfURL:ImageLink];
     if (data.length !=0) {

         UIImage *img = [[UIImage alloc] initWithData:data];
         if (img) {
             NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[unique objectAtIndex:x]]; //add our image to the path
             [data writeToFile:fullPath atomically:YES];
         }
         img = nil;

     }
     data = nil;
}

然而,这不是最佳解决方案。 -dataWithContentsOfURL:是同步方法,在下载文件时将停止执行主线程。因此,UI将在下载期间挂起。要使您的UI不挂起,您可以使用异步URL请求。

请参阅-sendAsynchronousRequest:queue:completionHandler:课程的NSURLConnection方法。或者,如果您的应用仅适用于iOS 7,请参阅-dataTaskWithURL:completionHandler:作为替代方案。