当我使用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]);
}
答案 0 :(得分:1)
CoreData实际上并不是存储图像数据的理想场所。
我倾向于只在document文件夹中存储imageData(或者只是实际图像,如果它们不敏感),然后将imageURL存储在持久化对象中。
通过这种方式,您可以通过这种方式返回图片,以获得更好的性能。
答案 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子目录中)。
有关详细信息,请阅读本书(披露:未附属)。