核心数据和 UIImage 的性能

Performance for Core Data and UIImage

我在 Core Data 中有一个图像。它必须保存为 NSData,我有一个计算 属性 来根据核心数据 属性 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 足够聪明以某种方式缓存计算属性?另外,这是从核心数据中获取图像的推荐方法,还是建议像这样获取一次并将其保存到新的 属性(不确定此代码是否正确):

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

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

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

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

如果您要将图像存储在 Core Data 中,正确的方法比您自己做的要简单。 UIImage 符合 NSCoding,这意味着您可以只创建具有核心数据 "transformable" 类型的 image 属性。然后 Core Data 将自动调用 NSCoding 方法来转换 to/from UIImage 并且您不需要问题中的任何代码。你只是 read/write 你的 UIImage.

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