【问题标题】:How to persist CGPaths to CoreData如何将 CGPaths 持久化到 CoreData
【发布时间】:2019-01-01 03:35:39
【问题描述】:

我正在 iOS 上制作绘图应用程序,并希望将用户绘图保存到核心数据。

我知道 NSData 是 CoreData 的一个属性类型,所以我正在考虑使用它。

我的想法是以某种方式将我的 CGPaths 数组转换为 NSData,然后将 NSData 保存到 Core Data。有没有人知道我将如何做到这一点或那里有更好的解决方案?

【问题讨论】:

    标签: ios swift core-graphics


    【解决方案1】:

    如果您将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)
    }
    

    【讨论】:

    • 谢谢。您还认为这是一种存储由 CGPaths 组成的绘图的有效方法吗?
    • 我通常直接使用UIBezierPath 而不是CGPath(这消除了上述过程中的一个步骤)。我还会考虑捕获实际的模型信息(坐标),而不是将相对不透明的 CoreGraphics/UIKit 对象存储为 blob。关于效率,您应该对其进行基准测试,看看是否存在实质性差异。 SQLite 在处理非常大的对象方面是出了名的低效,但您可能正在处理足够小的 blob,这可能是无关紧要的。但只需对其进行基准测试并查看。无论如何,这超出了上述问题的范围。
    【解决方案2】:

    由于UIBezierPath 符合NSSecureCoding,您所要做的就是设置自定义类和模块以使其工作。

    entity.path = UIBezierPath(cgPath: cgPath)
    

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 1970-01-01
      • 2017-05-10
      • 2020-10-08
      • 2018-06-22
      • 2011-02-03
      • 2014-04-25
      • 2011-01-17
      • 1970-01-01
      相关资源
      最近更新 更多