【问题标题】:Store gif in Core Data - Swift 3在核心数据中存储 gif - Swift 3
【发布时间】:2017-10-29 01:04:56
【问题描述】:

如何在 Core Data 中存储从 HTTP 请求获取的 GIF 图像? 我已经将带有 UIImagePNGRepresentation 的静态图像作为 NSData 存储在二进制数据属性中,但是我有如何处理 gif?

编辑:到目前为止,我所做的是从请求中获取数据,然后使用 UIImagePNGRepresentation 将其存储在 BinaryData 中。但是当我尝试使用 SwiftyGif 创建 UIImage 时,会出现一条错误消息,上面写着 Could not determine delay times for GIF。所以我猜 PNG 表示会与 GIF 的帧混淆。 我也尝试直接存储来自 http 请求的数据,但是 UIView 向我抛出了这个错误:Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN

【问题讨论】:

  • 真的没有区别。您也可以将 GIF 转储为二进制文件。

标签: swift core-data gif


【解决方案1】:

gif是一种文件格式,文件是数据,数据可以存储在核心数据中。尽管如此,在任何数据库中存储大量二进制数据都是一种不好的做法,而文件系统通常是更好的选择。我建议将文件存储在文件系统中并在数据库中保留相对文件路径(确保它是相对的,因为应用程序的容器目录可以更改)。如果这些是从服务器检索并且可以重新获取的图像,则它们应该存储在 tmp 目录中(或者应该使用 SDWebImage 之类的东西单独管理)。如果以后无法检索它们,则应将它们存储在文档目录中。

如果这看起来很难,那么您仍然可以将它们存储在核心数据中。 Core-data 确实有一个选项,允许它将属性存储为数据库文件之外的文件(“允许外部存储”)。

【讨论】:

  • 核心数据自动将大型二进制对象写入文件,见setAllowsExternalBinaryDataStorage (ObjC)
  • 是的,这是真的,正如我在回答中提到的那样。这样做的问题是图像通常是可重新下载的,而临时目录是存储它们的正确位置。
  • 是的,您提到了带有核心数据的外部存储选项,但仅在答案的最后一部分中(……我只是错过了阅读……:)您的答案看起来就像您建议不要将大型二进制文件存储在一般数据库中,特别是核心数据中。我的意思是,在开始时指出核心数据完全符合您的建议是明智的:在文件系统中存储大型二进制对象。
【解决方案2】:

当您调用 UIImagePNGRepresentation 时,您正在将 PNG 数据转换为 Swift Data 结构。如果将其保存在 Core Data 中,您将使用二进制属性。

您没有提到您是如何存储 GIF 的。如果您将它们放在Data 实例中,那么您可以像使用 PNG 一样使用它们 - 使用 Core Data 二进制属性。如果您有 Data 以外的其他内容,请说明您使用哪种对象或结构来保存 GIF 数据。

【讨论】:

  • 我已经用更多信息更新了我的问题。所以现在我也想知道,UIImagePNGRepresentation 到底是做什么的?
  • 顾名思义,UIImagePNGRepresentationUIImage 转换为PNG 图像格式。结果作为Data 实例返回。听起来你真正的问题在于 SwiftyGif,因为你正在转换为 PNG 而不是使用 GIF 格式的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多