我正在尝试将多个图像从相机中捕获后保存到我的文档目录中。我试图保存约50张图像。但是每次我尝试保存它们时应用程序都会崩溃,因为图像太多并且我收到了内存警告。我不知道如何解决这个问题。 这是我的代码:
for (int i = 0; i<_arrImages.count; i++)
{
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
NSDate *date = [NSDate date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
[dateFormat setDateFormat:@"dd-MMM-yyyy"];
NSString *dateString = [dateFormat stringFromDate:date];
[dateFormat setDateFormat:@"dd-MMM-yyyy HH:mm:ss"];
NSString *dateStringId = [dateFormat stringFromDate:date];
[Utils saveImage:image withName:dateStringId toFolder:kImageFolder];
UIImage *thumbImage = [image imageCroppedAndScaledToSize:CGSizeMake(150, 112) contentMode:UIViewContentModeScaleAspectFill padToFit:YES];
[Utils saveImage:thumbImage withName:dateStringId toFolder:kThumbnailFolder];
NSMutableDictionary *sendDict = [[NSMutableDictionary alloc]init];
[sendDict setObject:dateStringId forKey:kitemId];
[sendDict setObject:@"image" forKey:kitemType];
[sendDict setObject:[Utils getPathForImageName:dateStringId ofFolder:kImageFolder] forKey:kitemPath];
[sendDict setObject:kStatusUnused forKey:kitemStatus];
[sendDict setObject:dateString forKey:kitemDate];
[sendDict setObject:[Utils getPathForImageName:dateStringId ofFolder:kThumbnailFolder] forKey:kitemThumb];
[SCDatabaseHandler insertIntoMainTableValues:sendDict];
});
}
答案 0 :(得分:3)
您的代码未显示image
的来源,但您不应同时在内存中保留所有图像。
使用dispatch_async
的实例而不是使用NSOperationQueue
,并将最大并发操作数设置为1或2.队列上的操作执行的块应加载并保存图像,以便你一次只能在内存中有一两张图像。
答案 1 :(得分:0)
通过像这样转换图像,有很多方法可以创建NSOperationQueue OR核心数据以将图像保存为NSData
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(myUIImage)];
或者像这样使用自动释放池
- (BOOL) getImageWithUrl:(NSString *)url toFile:(NSString *)toFile
{
@autoreleasepool
{
NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:url]] ;
if (data)
{
NSError *error ;
if ([[NSFileManager defaultManager] fileExistsAtPath:toFile])
{
NSLog(@"Existant %@", toFile) ;
[[NSFileManager defaultManager] removeItemAtPath:toFile error:nil] ;
}
if ([data writeToFile:toFile options:NSDataWritingAtomic error:&error]==NO)
{
NSLog(@"@Error creating file-%@ \n", toFile) ;
NSLog(@"@Error description-%@ \n", [error localizedDescription]) ;
NSLog(@"@Error suggestion-%@ \n", [error localizedRecoverySuggestion]) ;
NSLog(@"Error reason-%@", [error localizedFailureReason]) ;
}
else
{
return(true) ;
}
}
return(false) ;
}
}
您可以使用AFNetworking来管理在后台线程中下载图像并对其进行缓存。使用方法取决于您的应用程序的要求。注意:编写代码时不进行编译或测试。希望它有助于:)