【问题标题】:Which way to store data(image)? NSData, String or Transformable以哪种方式存储数据(图像)? NSData、字符串或可转换
【发布时间】:2011-11-26 19:12:25
【问题描述】:

我一直在使用 base64 编码。我已经成功地将图像从 NSData 编码为 NSString,我还将它解码回 NSData。

所以现在我想将图像存储在 Core Data 中。但是最好存储一个 NSString、NSData 还是第三个可转换对象?

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

提前致谢。

【问题讨论】:

    标签: objective-c ios xcode core-data


    【解决方案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 存储之外

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-15
        • 2012-07-10
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        • 2015-08-28
        • 1970-01-01
        相关资源
        最近更新 更多