我正在尝试从服务器下载数千张图片(每张最多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;
}
问题:如何在内存压力下没有应用程序崩溃的情况下下载所有图像?
答案 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:作为替代方案。