【发布时间】:2019-01-01 03:35:39
【问题描述】:
我正在 iOS 上制作绘图应用程序,并希望将用户绘图保存到核心数据。
我知道 NSData 是 CoreData 的一个属性类型,所以我正在考虑使用它。
我的想法是以某种方式将我的 CGPaths 数组转换为 NSData,然后将 NSData 保存到 Core Data。有没有人知道我将如何做到这一点或那里有更好的解决方案?
【问题讨论】:
标签: ios swift core-graphics
我正在 iOS 上制作绘图应用程序,并希望将用户绘图保存到核心数据。
我知道 NSData 是 CoreData 的一个属性类型,所以我正在考虑使用它。
我的想法是以某种方式将我的 CGPaths 数组转换为 NSData,然后将 NSData 保存到 Core Data。有没有人知道我将如何做到这一点或那里有更好的解决方案?
【问题讨论】:
标签: ios swift core-graphics
如果您将CGPath 转换为UIBezierPath,则支持NSCoding/NSSecureCoding:
do {
let path = UIBezierPath(cgPath: cgPath)
let data = try NSKeyedArchiver.archivedData(withRootObject: path, requiringSecureCoding: false)
} catch {
print(error)
}
您还可以将Data 转换回UIBezierPath:
do {
if let path = try NSKeyedUnarchiver.unarchivedObject(ofClass: UIBezierPath.self, from: data) {
let cgPath = path.cgPath
}
} catch {
print(error)
}
【讨论】:
UIBezierPath 而不是CGPath(这消除了上述过程中的一个步骤)。我还会考虑捕获实际的模型信息(坐标),而不是将相对不透明的 CoreGraphics/UIKit 对象存储为 blob。关于效率,您应该对其进行基准测试,看看是否存在实质性差异。 SQLite 在处理非常大的对象方面是出了名的低效,但您可能正在处理足够小的 blob,这可能是无关紧要的。但只需对其进行基准测试并查看。无论如何,这超出了上述问题的范围。