我在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
}
}
}
但是,我相信每次提取图片时此代码都会在UIImage
和NSData
之间进行转换,这种情况很常见,因为这些数据用于填充UITableViewCell
。这是真的,还是Xcode足够智能以某种方式缓存计算属性?此外,这是从Core Data获取图像的推荐方法,还是建议一次获取它并将其保存到这样的新属性(不确定此代码是否正确):
lazy var image: UIImage? = {
if let imageData = imageData {
return UIImage(data: imageData)
} else {
return nil
}
}()
我看到的最后一个方面的缺点是,如果不更新imageData
,就可以更改image
。我也不确定我是否可以在后一版本中使用didSet
来更新Core Data。
答案 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中存储图片,请确保图片不会太大。核心数据可以处理它们,但您可能会发现,当您不期望时,图像数据会被加载。例如,如果您仅使用托管对象的其他非图像属性,但无论如何都会加载图像数据。