我正在使用NSURLSessionDownload任务在UITableViewCells中下载图像。每个单元格包含图像视图和一些相关文本。
应用必须与网络服务同步,并且能够在互联网连接不可用时保留数据。所以我使用Core Data来存储文本信息,图像存储在文件系统中。我必须以大约10 KB的大小检索大多数图像。它总共只有大约20张图片。但是,其中一个图像是6 MB。
这是我的问题:下载10KB图像时,应用程序使用的堆分配持久字节大约为8 MB。下载了6 MB的图像后,持久性字节大约达到100 MB,我收到内存警告,有时终止应用程序。
我不确定如何解决这个问题。欢迎任何帮助。感谢。
下载较小尺寸图像时泄漏仪器的屏幕截图。
下载6 MB图像后,泄漏仪器的屏幕截图。
以下是我用来填充表格视图单元格的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
Person *person = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = person.alias;
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", person.status];
// Determine the path to use to store the file
NSString *imagePath = [[SyncEngine sharedEngine].imagesDirectory.path stringByAppendingFormat:@"/%@", person.alias];
if ([[NSFileManager defaultManager] fileExistsAtPath:imagePath]) {
cell.imageView.image = [UIImage imageWithContentsOfFile:imagePath];
} else {
cell.imageView.image = [UIImage imageNamed:@"image-placeholder"];
NSURL *imageURL = [NSURL URLWithString:person.imageURL];
NSURLSessionDownloadTask *imageDownloadTask = [[SyncEngine sharedEngine].session downloadTaskWithURL:imageURL completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
@autoreleasepool {
NSData *imageData = [NSData dataWithContentsOfURL:location];
NSLog(@"%@ original image size: %lu B", person.alias, (unsigned long)imageData.length);
UIImage *image = [UIImage imageWithData:imageData];
imageData = UIImageJPEGRepresentation(image, 0.2);
NSLog(@"Compressed: %lu", (unsigned long)imageData.length);
// Save the image to file system
NSError *saveError = nil;
BOOL saved = [imageData writeToFile:imagePath options:0 error:&saveError];
if (saved) {
NSLog(@"File saved");
} else {
NSLog(@"File not saved:\n%@, %@", saveError, saveError.userInfo);
}
dispatch_async(dispatch_get_main_queue(), ^{
cell.imageView.image = [UIImage imageWithContentsOfFile:imagePath];
});
}
}];
[imageDownloadTask resume];
}
return cell;
}
答案 0 :(得分:1)
问题解决了。只需压缩和调整图像大小。