【发布时间】:2011-11-26 19:12:25
【问题描述】:
我一直在使用 base64 编码。我已经成功地将图像从 NSData 编码为 NSString,我还将它解码回 NSData。
所以现在我想将图像存储在 Core Data 中。但是最好存储一个 NSString、NSData 还是第三个可转换对象?
我将图像转换为 NSString 的原因是我也想将它存储在 XML 中。
提前致谢。
【问题讨论】:
标签: objective-c ios xcode core-data
我一直在使用 base64 编码。我已经成功地将图像从 NSData 编码为 NSString,我还将它解码回 NSData。
所以现在我想将图像存储在 Core Data 中。但是最好存储一个 NSString、NSData 还是第三个可转换对象?
我将图像转换为 NSString 的原因是我也想将它存储在 XML 中。
提前致谢。
【问题讨论】:
标签: objective-c ios xcode core-data
可转换(根据@timthetoolman)是最简单的方法。但是,如果您的图像很大,从 iOS 5 开始,正确的做法是使用“二进制数据”属性类型并选择“允许外部存储”,以便 Core Data 可以将大块数据存储在数据库。这样会更有效率。
【讨论】:
使用 NSValueTransformer 将图像转换为 NSData 对象,然后将数据块存储在 Core Data 中。您可以在建模工具中注册您的价值转换器子类。您可以查看 Apple 的 PhotoLocations 示例或此 tutorial 说明如何操作。
为完整性而编辑:正如其他人指出的那样,太大的数据块会导致性能问题。正如@Jesse 所指出的,iOS5 有一个优化,如果数据块太大,那么 Core Data 会将它存储在持久存储之外。如果您必须针对 iOS5 之前的版本并且图像太大,那么您应该将文件保存在沙箱中的某个位置,并将 URL 存储在 Core Data 存储中。 Apple Dev Forums is here 中的一个很好的讨论,并讨论了在 Core Data 中存储数据 blob 的限制。
祝你好运
【讨论】:
我认为您不应该将它们存储在核心数据中,我用图像尝试过一次,发现它太慢了。您应该将图像的位置存储在核心数据中,但只需将图像写入文件。你可以这样做:
// JPEG
[UIImageJPEGRepresentation(image, 1.0) writeToFile:jpgPath atomically:YES];
// PNG
[UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES];
【讨论】:
Xcode 和 iOS 的较新版本现在使存储图像既简单又高效。您不再需要为了方便而选择将图像存储在核心数据中,或者为了性能而选择将图像存储在文件系统中——核心数据会为您处理好它。
UIImage 现在符合 iOS 5 中的 NSCoding。如果您能够针对 iOS 5 及更高版本,您只需将托管对象的属性设置为 Transformable 即可。【讨论】: