在核心数据中存储UIColor对象

rat*_*p99 14 core-data uicolor ios

我想将一个UIColor对象作为属性存储在Core Data实体上,然后检索它并以与我在该实体上执行其他属性相同的方式使用它.

在我的研究中,虽然文献看起来很稀疏,但我发现这篇文章说该属性应该被指定为"可转换",并且数据应该在使用NSKeyedArchiver和出现时手动转换NSKeyedUnarchiver.

但后来,我找到了一篇更新的帖子说,所有必要的是将UIColor保存为CD中的Transformable属性,生成一个Managed Object子类,并像其他属性一样使用.

苹果文档本身进入一些细节上的存储和检索NSColor上的对象,而不是(我能找到)UIColor.但是,它听起来像归档/取消归档在CD中自动处理.也许.我被这条线弄糊涂了:

如果您在Xcode中使用模型编辑器,请在属性的"类型"弹出窗口中选择"可变换",然后在"值变换器名称"文本字段中键入名称.

我假设他们正在谈论属性的名称,但我不确定,特别是因为它警告明确指定变换器可能引起的问题:

要点:虽然默认转换器是NSKeyedUnarchiveFromDataTransformerName指定的转换器,但实际上反向使用此转换器.如果明确指定默认转换器,Core Data将"以错误的方向"使用它.

我已经达到了这样的程度:我有一个名为"color"的新的可转换属性(没有命名变换器)并且生成了一个包含新"color"属性(类型id)的新子类文件.

我只是简单地困惑.有人可以给我一些关于如何从这里开始的明确指导吗?

如果重要的话,我正在使用MagicalRecord与Core Data进行交互.

非常感谢您的帮助!

que*_*ish 32

您的属性应为Transformable类型.默认值转换器(NSKeyedUnarchiveFromDataTransformerName)可以转换符合NSCoding的任何对象.

  1. 将属性标记为"可转换"类型.
  2. 可选:将Value Transformer Name设置为"NSKeyedUnarchiveFromDataTransformerName".如果不这样做,无论如何都会默认为此.

像这样

你不必做任何其他事情.请记住,您无法将可转换属性与谓词匹配或按谓词排序.它们几乎只是存储 - 值变换器将对象值转换为NSData,这是在商店中持久存储的内容.当属性故障触发时,Core Data使用另一个方向的转换器从NSData转到您的对象类型.

  • 在 Swift 5 中,我收到以下错误:此应用程序中的一个或多个模型正在使用可转换属性,其转换器名称要么未设置,要么设置为 NSKeyedUnarchiveFromDataTransformerName。请改用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer 的子类。在某些时候,当指定 nil 时,Core Data 将默认使用“NSSecureUnarchiveFromData”,并且包含不支持 NSSecureCoding 的类的可转换属性将变得不可读。 (4认同)

Ana*_*and 7

另一种选择,Swift 3

extension UIColor {
    class func color(withData data:Data) -> UIColor {
         return NSKeyedUnarchiver.unarchiveObject(with: data) as! UIColor
    }

    func encode() -> Data {
         return NSKeyedArchiver.archivedData(withRootObject: self)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

var myColor = UIColor.green
// Encoding the color to data
let myColorData = myColor.encode() // This can be saved into coredata/UserDefaulrs
let newColor = UIColor.color(withData: myColorData) // Converting back to UIColor from Data
Run Code Online (Sandbox Code Playgroud)

  • 请不要将[相同答案](http://stackoverflow.com/a/41800750/5292302)添加到多个问题中.回答最好的一个并将其余部分标记为重复.请参阅[为几个问题添加重复答案是否可以接受?](http://meta.stackexchange.com/questions/104227/is-it-acceptable-to-add-a-duplica te-answer-to-几个问句) (3认同)