尝试在ios中保存大量数据时出现内存问题

时间:2013-12-09 15:50:26

标签: ios iphone database uiimage

我正在尝试将多个图像从相机中捕获后保存到我的文档目录中。我试图保存约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];
               });
}

2 个答案:

答案 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来管理在后台线程中下载图像并对其进行缓存。使用方法取决于您的应用程序的要求。注意:编写代码时不进行编译或测试。希望它有助于:)