Core Data 和 UIImage 的性能
Posted
技术标签:
【中文标题】Core Data 和 UIImage 的性能【英文标题】:Performance for Core Data and 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
但是,我相信每次获取图像时,这段代码都会在UIImage
和NSData
之间转换,因为这些数据用于填充UITableViewCell
,所以这种情况经常发生。这是真的,还是 Xcode 足够智能以某种方式缓存计算属性?另外,这是从 Core Data 获取图像的推荐方式,还是建议提取一次并将其保存到这样的新属性中(不确定此代码是否正确):
lazy var image: UIImage? =
if let imageData = imageData
return UIImage(data: imageData)
else
return nil
()
我看到的最后一个的缺点是可以在不更新image
的情况下更改imageData
。我也不确定是否可以在后一个版本中使用didSet
来更新Core Data。
【问题讨论】:
look at this git repo 它在表格中显示来自 CoreData 的图像。它是异步的,不会获取单元格中的图像,而是以单独的方法获取。 how to : images & coredata 【参考方案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?一切正常!以上是关于Core Data 和 UIImage 的性能的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Documents 文件夹中保存 UIImagePicker 中的 UIImage 并获取路径字符串以保存在 Swift 中的 Core Data 中