关于Objective C:哪种方式存储数据(图像)? NSData,字符串或可转换

Which way to store data(image)? NSData, String or Transformable

我一直在使用base64编码。我已成功将图像从NSData编码为NSString,也将其解码回了NSData。

现在,我想将图像存储在Core Data中。但是,最好存储一个NSString,NSData或第三个可转换的吗?

将图像转换为NSString的原因是因为我也想将其存储在XML中。

预先感谢。


可变形(按照@timthetoolman的说法)是最简单的方法。但是,如果图像较大,则从iOS 5开始,正确的方法是使用"二进制数据"属性类型并选择"允许外部存储",以便Core Data可以存储较大的Blob。数据库外部的数据。这样可以更有效率。


使用NSValueTransformer将图像从图像转换为NSData对象,然后将数据blob存储在Core Data中。您可以在建模工具中注册值转换器子类。您可以查看Apple的PhotoLocations示例,或者本教程显示操作方法。

进行完整性编辑:正如其他人指出的那样,太大的数据块会导致性能问题。正如@Jesse指出的那样,iOS5进行了优化,如果数据blob太大,那么Core Data会将其存储在持久性存储之外。如果您必须定位iOS5之前的版本并且图像太大,则应将文件保存在沙箱中的某个位置,然后将URL存储在Core Data存储中。 Apple Dev论坛上的精彩讨论在这里,讨论了在Core Data中存储数据Blob的限制。

祝你好运


目标iOS5或更高版本-性能图像存储变得微不足道

新版本的Xcode和iOS现在使存储图像既简单又高效。为了方便起见,您不再需要选择将图像存储在核心数据中或将文件存储在文件系统中以提高性能-核心数据将为您处理。

  • UIImage现在符合iOS 5中的NSCoding。如果您能够定位到iOS 5及更高版本,则只需将托管对象的属性设置为Transformable即可。
  • 如果您选中"允许外部存储"选项,Core Data将决定是将BLOB存储在托管对象中还是作为外部文件存储-对开发人员都是透明的。使较大的图像保存在核心数据存储区之外

我不认为您应该将它们存储在核心数据中,我尝试对图像进行一次尝试,发现它太慢了。您应该将图像的位置存储在核心数据中,而只是将图像写入文件中。您可以按照以下步骤进行操作:

1
2
3
4
5
// JPEG
[UIImageJPEGRepresentation(image, 1.0) writeToFile:jpgPath atomically:YES];

// PNG
[UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES];