【发布时间】:2014-05-04 20:27:18
【问题描述】:
我正在寻找将多个图像存储在一个核心数据对象中的最佳方法。我尝试将 UIImage 对象直接存储在 Core Data 中。工作正常!
尽管如此,我在一些论坛中阅读了将 UIImage 数据转换为 PNG 并将其存储为二进制数据的信息。在我的 iPhone 5s 上,这非常慢。
有什么好处和坏处?还有其他解决方案吗?
谢谢!
【问题讨论】:
标签: objective-c core-data uiimage ios7.1
我正在寻找将多个图像存储在一个核心数据对象中的最佳方法。我尝试将 UIImage 对象直接存储在 Core Data 中。工作正常!
尽管如此,我在一些论坛中阅读了将 UIImage 数据转换为 PNG 并将其存储为二进制数据的信息。在我的 iPhone 5s 上,这非常慢。
有什么好处和坏处?还有其他解决方案吗?
谢谢!
【问题讨论】:
标签: objective-c core-data uiimage ios7.1
如果您的目标是 iOS 6.0 或更高版本或 OSX 10.8 或更高版本,您可以打开允许外部存储(选择您的属性并查看 Data Model Inspector Core Data 模型编辑器)并让 Core Data 决定是否要将您的图像数据存储在数据库中或外部文件中(如果它超过一定大小)。
【讨论】:
将图像保存到数据库的好方法只有一种,不要这样做。
只需将其写入某个文件夹中的文件并仅存储文件名(或相对路径)。不要存储绝对文件路径,这会在从应用商店更新应用时导致问题。
推理:
与其他类型的数据相比,图像数据量很大。它使托管对象的保存(和加载)显着变慢。独立于数据库代码的图像加载/保存非常有帮助。您可以加载对象元数据或按元数据搜索并仅在需要时加载实际图像(最慢的操作)。
数据库中不需要有图像,您永远不会按数据搜索图像。
【讨论】:
不要在 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.
【讨论】:
在不损失太多性能的情况下使用 Core Data 管理图像的一些技巧:
如果您的图像非常小(~100 ko),则将其与与图像相关的其他信息存储在同一实体中。
否则我建议你只将图片的路径存储在CoreData中并保存在设备中。
否则,如果您真的想将图像保留在CoreData中而不管其大小,您能否向我们展示一下非常慢的代码?
【讨论】: