以哪种方式存储数据(图像)? NSData、字符串或可转换
Posted
技术标签:
【中文标题】以哪种方式存储数据(图像)? NSData、字符串或可转换【英文标题】:Which way to store data(image)? NSData, String or Transformable 【发布时间】:2011-11-26 19:12:25 【问题描述】:我一直在使用 base64 编码。我已经成功地将图像从 NSData 编码为 NSString,我还将它解码回 NSData。
所以现在我想将图像存储在 Core Data 中。但是最好存储一个 NSString、NSData 还是第三个可转换对象?
我将图像转换为 NSString 的原因是我也想将它存储在 XML 中。
提前致谢。
【问题讨论】:
【参考方案1】:可转换(根据@timthetoolman)是最简单的方法。但是,如果您的图像很大,从 ios 5 开始,正确的做法是使用“二进制数据”属性类型并选择“允许外部存储”,以便 Core Data 可以将大块数据存储在数据库。这样会更有效率。
【讨论】:
【参考方案2】:使用 NSValueTransformer 将图像转换为 NSData 对象,然后将数据块存储在 Core Data 中。您可以在建模工具中注册您的价值转换器子类。您可以查看 Apple 的 PhotoLocations 示例或此 tutorial 说明如何操作。
为完整性而编辑:正如其他人指出的那样,太大的数据块会导致性能问题。正如@Jesse 所指出的,iOS5 有一个优化,如果数据块太大,那么 Core Data 会将它存储在持久存储之外。如果您必须针对 iOS5 之前的版本并且图像太大,那么您应该将文件保存在沙箱中的某个位置,并将 URL 存储在 Core Data 存储中。 Apple Dev Forums is here 中的一个很好的讨论,并讨论了在 Core Data 中存储数据 blob 的限制。
祝你好运
【讨论】:
我明白了,所以首选的方法是使用 NSValueTransformer。但这不会让我无法将图像存储在 XML 中吗? 你创建的 NSValueTransfirmer 的子类可以从一个值转换为另一个值。您需要编写执行转换的代码,以便无法转换为您喜欢的格式!【参考方案3】:我认为您不应该将它们存储在核心数据中,我用图像尝试过一次,发现它太慢了。您应该将图像的位置存储在核心数据中,但只需将图像写入文件。你可以这样做:
// JPEG
[UIImageJPEGRepresentation(image, 1.0) writeToFile:jpgPath atomically:YES];
// PNG
[UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES];
【讨论】:
同意。除非它们实际上是 10 千字节,否则文件系统是仅在核心数据中存储引用的方式。核心数据是对象存储而不是数据库。【参考方案4】:以 iOS5 或更高版本为目标——高性能图像存储变得微不足道
Xcode 和 iOS 的较新版本现在使存储图像既简单又高效。您不再需要为了方便而选择将图像存储在核心数据中,或者为了性能而选择将图像存储在文件系统中——核心数据会为您处理好它。
UIImage
现在符合 iOS 5 中的 NSCoding
。如果您能够针对 iOS 5 及更高版本,您只需将托管对象的属性设置为 Transformable
即可。
如果您选中“允许外部存储”选项,Core Data 将决定是将 BLOB 存储在托管对象中还是作为外部文件存储——所有这些都对开发人员透明。将更大的图像保存在您的 Core Data 存储之外
【讨论】:
以上是关于以哪种方式存储数据(图像)? NSData、字符串或可转换的主要内容,如果未能解决你的问题,请参考以下文章