存储较大图像时的核心数据问题

时间:2015-03-10 09:57:46

标签: ios core-data

当我使用for循环在核心数据中存储较大尺寸的图像时,我通过didReceiveMemoryWarning方法接收内存警告消息 迭代计数为300.现在基于内存警告,我可以向用户显示内存已满的警报,请同步您的图像"。但我的问题是我无法获得大于300的记忆警告。即我正在获得300次迭代的记忆警告。在300以上且300以下我没有得到记忆警告。

这是我用过的代码

for (int i=0;i<=300;i++)
    {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *persistentStorePath = [documentsDirectory stringByAppendingPathComponent:@"DetailsRegister.sqlite"];
 NSEntityDescription *entity = [NSEntityDescription entityForName:@"EMpDetails" inManagedObjectContext:context];

         NSManagedObject *newDevice=[[NSManagedObject alloc]initWithEntity:entity insertIntoManagedObjectContext:context];
         UIImage *image = [UIImage imageNamed:@"image.png"];
        imageview.image=image;
        [self SaveImage:image];
        dataImage = UIImageJPEGRepresentation(image, 0.0);

       [newDevice setValue:dataImage forKey:@"image"]; // obj refers to NSManagedObject

            error = nil;
            // Save the object to persistent store
            if (![context save:&error]) {
                NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
            }

2 个答案:

答案 0 :(得分:1)

CoreData实际上并不是存储图像数据的理想场所。

我倾向于只在document文件夹中存储imageData(或者只是实际图像,如果它们不敏感),然后将imageURL存储在持久化对象中。

通过这种方式,您可以通过这种方式返回图片,以获得更好的性能。

enter image description here

答案 1 :(得分:0)

Again借鉴Marcus S. Zarra的Core Data: Data Storage and Management for iOS, OS X, and iCloud(第2版),其中一项建议如下:

  
      
  • 小二进制数据[...]任何小于100千字节的数据[...]当处理这么小的东西时,它是最   有效地将其直接存储为其中的属性值   对应表。
  •   
  • 中等二进制数据[...]任何大于100的数据   千字节和小于1兆字节的数据   此大小的大小也可以直接存储在存储库中。然而,   数据应该存储在另一端的自己的表中   与主要表的关系。
  •   
  • 大二进制数据[...]大于1   兆字节大小[...]此大小的任何二进制数据   应该存储在磁盘上而不是存储库中。工作时   对于此大小的数据,最好存储其路径信息   直接在主实体中[...]并将二进制数据存储在磁盘上的已知位置(例如,在应用程序的Application Support子目录中)。
  •   

有关详细信息,请阅读本书(披露:未附属)。