【问题标题】:Performance for Core Data and UIImageCore Data 和 UIImage 的性能
【发布时间】:2016-06-06 18:56:28
【问题描述】:

我在 Core Data 中有一张图片。它必须保存为 NSData,并且我有一个计算属性来获取和设置基于 Core Data 属性imageData 的图像:

var image: UIImage? {
    get {
        if let imageData = imageData {
            return UIImage(data: imageData)
        } else {
            return nil
        }
    }

    set {
        if let image = image {
            imageData = UIImagePNGRepresentation(image)
        } else {
            imageData = nil
        }
    }
}

但是,我相信每次获取图像时,这段代码都会在UIImageNSData 之间转换,因为这些数据用于填充UITableViewCell,所以这种情况经常发生。这是真的,还是 Xcode 足够智能以某种方式缓存计算属性?另外,这是从 Core Data 获取图像的推荐方式,还是建议提取一次并将其保存到这样的新属性中(不确定此代码是否正确):

lazy var image: UIImage? = {
        if let imageData = imageData {
            return UIImage(data: imageData)
        } else {
            return nil
        }
}()

我看到的最后一个的缺点是可以在不更新image 的情况下更改imageData。我也不确定是否可以在后一个版本中使用didSet 来更新Core Data。

【问题讨论】:

标签: ios swift core-data uiimage nsdata


【解决方案1】:

假设imageData是实体描述的一个属性,

  • 托管对象上下文将缓存imageData
  • image 不会被缓存,每次都会重新计算。

如果您要在 Core Data 中存储图像,正确的方法比您做的要简单。 UIImage 符合 NSCoding,这意味着您可以只创建一个具有 Core Data “可转换”类型的 image 属性。然后,Core Data 将自动调用NSCoding 方法来转换为UIImage 或从UIImage 转换,并且您不需要问题中的任何代码。你只需读/写你的UIImage

如果您要使用 any 方案将图像存储在 Core Data 中,请确保图像不会太大。 Core Data 可以处理它们,但您可能会发现图像数据在您不期望的情况下被加载。例如,如果您只使用托管对象的其他非图像属性,但无论如何都会加载图像数据。

【讨论】:

  • 另外,如果图片很大,请在模型编辑器中将图片属性标记为“外部存储”。
  • @Mundi 不幸的是,这(仍然!)不是可转换属性的选项。
  • 好的,感谢您指出这一点!我想另一个值得指出的解决方案是使用NSData 作为属性类型,选择“外部存储”并编写一个方便的方法来检索图像。这将非常接近 OP 的解决方案。
  • 谢谢。这个解决方案听起来不错,但我未能实现这一点。当我在 Core Data 中将我的图像属性设置为可转换并生成NSManagedObject 时,它的类型为NSObject?。如果我只分配myImageView.image = myTransformableProperty,我显然会收到一条错误消息,指出我不能将NSObject? 类型的值分配给UIImage?。我该如何解决这个问题?
  • 啊,没关系。我改变了NSObject?到 UIImage?一切正常!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多