我正在寻找在一个核心数据对象中存储多个图像的最佳方法。我试图直接在Core Data中存储UIImage对象。工作正常!
然而,我在一些论坛中读到将UIImage数据转换为PNG并将其存储为二进制数据。在我的iPhone 5s上,这非常慢。
有什么利弊?还有其他解决方案吗?
谢谢!
答案 0 :(得分:6)
如果您的目标是iOS 6.0或更高版本或OSX 10.8或更高版本,则可以启用允许外部存储(选择您的属性并查看数据模型检查器中的数据模型检查器 核心数据模型编辑器)让Core Data决定是将图像数据存储在数据库中还是存储在外部文件中(如果它超过一定大小)。
答案 1 :(得分:3)
将图像保存到数据库只有一种好办法 - 不要这样做。
只需将其写入某个文件夹中的文件,并仅存储文件名(或相对路径)。不要存储绝对文件路径,这会在从应用商店更新应用时导致问题。
推理:
与其他类型的数据相比,图像数据很大。它使托管对象的保存(和加载)速度明显变慢。独立于DB代码进行图像加载/保存非常有用。您可以加载对象元数据或按元数据搜索,并仅在需要时加载实际图像(最慢的操作)。
数据库中不需要图像,也不需要按数据搜索图像。
答案 2 :(得分:2)
不要将图像存储在Core Data中。将路径存储到Core Data中。
您可以将任何图片保存到application sandbox的Library
或Documents
目录。
简单示例:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryDirectory = [paths objectAtIndex:0];
NSString *path = [libraryDirectory stringByAppendingPathComponent:fileName];
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:path atomically:YES];
// Save file name to Core Data. Don't store absolute paths.
答案 3 :(得分:0)
使用Core Data管理图像而不会丢失太多性能的一些提示:
如果您的图像非常小(~100 ko),则将其与相对于图像的其他信息存储在同一实体中。
否则我建议您只在CoreData中存储图片的路径并将其保存在设备中。
否则,如果您真的想要将图像保存在CoreData中而不管其大小如何,您能否向我们展示非常慢的代码?