在Core Data中保存图像的最佳方法

时间:2014-05-04 20:27:18

标签: objective-c core-data uiimage ios7.1

我正在寻找在一个核心数据对象中存储多个图像的最佳方法。我试图直接在Core Data中存储UIImage对象。工作正常!

然而,我在一些论坛中读到将UIImage数据转换为PNG并将其存储为二进制数据。在我的iPhone 5s上,这非常慢。

有什么利弊?还有其他解决方案吗?

谢谢!

4 个答案:

答案 0 :(得分:6)

如果您的目标是iOS 6.0或更高版本或OSX 10.8或更高版本,则可以启用允许外部存储(选择您的属性并查看数据模型检查器中的数据模型检查器 核心数据模型编辑器)让Core Data决定是将图像数据存储在数据库中还是存储在外部文件中(如果它超过一定大小)。

答案 1 :(得分:3)

将图像保存到数据库只有一种好办法 - 不要这样做。

只需将其写入某个文件夹中的文件,并仅存储文件名(或相对路径)。不要存储绝对文件路径,这会在从应用商店更新应用时导致问题。

推理:

  1. 与其他类型的数据相比,图像数据很大。它使托管对象的保存(和加载)速度明显变慢。独立于DB代码进行图像加载/保存非常有用。您可以加载对象元数据或按元数据搜索,并仅在需要时加载实际图像(最慢的操作)。

  2. 数据库中不需要图像,也不需要按数据搜索图像。

答案 2 :(得分:2)

不要将图像存储在Core Data中。将路径存储到Core Data中。

您可以将任何图片保存到application sandboxLibraryDocuments目录。

简单示例:

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中而不管其大小如何,您能否向我们展示非常慢的代码?