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
        
    

但是,我相信每次获取图像时,这段代码都会在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。

【问题讨论】:

look at this git repo 它在表格中显示来自 CoreData 的图像。它是异步的,不会获取单元格中的图像,而是以单独的方法获取。 how to : images & coredata 【参考方案1】:

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

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

如果您要在 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 的性能的主要内容,如果未能解决你的问题,请参考以下文章

将 UIImage 保存到 Core Data 时出错

使用 Core Graphics 绘制 UIImage?

Core-Data 后台保存性能问题

如何在 Documents 文件夹中保存 UIImagePicker 中的 UIImage 并获取路径字符串以保存在 Swift 中的 Core Data 中

UI 端和子项目中的 Core Data 最佳实践实现

如何使用 Core Data 有效地保存 UI/主线程中所做的更改?