核心数据和 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
}
}
}
但是,我相信每次获取图像时这段代码都会在 UIImage
和 NSData
之间转换,这可能会很频繁,因为此数据用于填充 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 可以处理它们,但您可能会发现图像数据在您不期望的时候被加载。例如,如果您仅使用托管对象的其他非图像属性,但无论如何都会加载图像数据。
我在 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
}
}
}
但是,我相信每次获取图像时这段代码都会在 UIImage
和 NSData
之间转换,这可能会很频繁,因为此数据用于填充 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 可以处理它们,但您可能会发现图像数据在您不期望的时候被加载。例如,如果您仅使用托管对象的其他非图像属性,但无论如何都会加载图像数据。