核心数据和UIImage的性能

时间:2016-06-06 18:56:29

标签: ios swift core-data uiimage nsdata

我在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
        }
}()

我看到的最后一个方面的缺点是,如果不更新imageData,就可以更改image。我也不确定我是否可以在后一版本中使用didSet来更新Core Data。

1 个答案:

答案 0 :(得分:1)

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

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

如果您要将图像存储在Core Data中,正确的方法比您制作图像更简单。 UIImage符合NSCoding,这意味着您只需使用核心数据"可转换"创建image属性即可。类型。然后,核心数据会自动调用NSCoding方法转换为UIImage或从UIImage转换,您不需要问题中的任何代码。您只需读/写var story = Backbone.Model.extend({ initialize: function () { if(this.get('MediaItems') instanceof Array){ this.MediaItems = new mediaItems(this.get('MediaItems')); } else { this.MediaItems = this.get('MediaItems'); } this.MediaItems.parent = this; } });

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