在Core Data中存储UIColor对象

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

在我的研究中,虽然文献看起来很稀less,但是我发现这篇文章说这个属性应该被指定为“Transformable”,并且应该使用NSKeyedArchiver手动转换数据,并使用NSKeyedUnarchiver出来。

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

苹果文档本身会详细介绍如何存储和检索NSColor对象,但不是(我可以find)在UIColor 。 但是,这听起来像在CD中自动处理归档/解除归档。 也许。 我被这条线弄糊涂了:

如果您在Xcode中使用模型编辑器,请在属性的“types”popup框中select“可变形”,然后在“值变换器名称”文本字段中键入名称。

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

重要提示:尽pipe默认变换器是由NSKeyedUnarchiveFromDataTransformerName指定的变换器,但实际上这个变换器是反向使用的。 如果明确指定默认转换器,则Core Data将使用“错误的方向”。

我已经到了一个地步,我有一个名为“color”的新变形属性(没有命名变换器),并生成了一个新的包含新的“color”属性(typesid)的子类文件。

我只是很困惑。 有人可以给我一些关于如何从这里出发的明确指导吗?

我正在使用MagicalRecord来与核心数据接口,如果这很重要。

非常感谢您的帮助!

你的属性应该是Transformabletypes的。 默认值转换器(NSKeyedUnarchiveFromDataTransformerName)可以转换任何符合NSCoding的对象。

  1. 将该属性标记为types“Tranformable”。
  2. 可选:将值转换器名称设置为“NSKeyedUnarchiveFromDataTransformerName”。 如果你不这样做,它会默认这个。

像这样

你不必做任何事情。 请记住,您将无法将可变形属性与谓词匹配或按它们sorting。 它们几乎就是存储 – 值转换器将对象值转换成NSData,这是持久存储在商店。 当属性错误触发时,Core Data使用另一个方向上的变换器从NSData转到您的对象types。

另一个选项, 斯威夫特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) } } 

用法

 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 

为了将UIColor保存为核心数据,您需要分隔红色,蓝色和绿色值。 然后,在您的创build代码中,获取RGB值并使用获取的结果创build一个UIColor对象。 这样做比听起来容易,你不必提供NSKeyArchiver / Unarchiver或NSUserDefaults的任何工作。

在您的数据模型中,在您的颜色实体中,创build三个属性:floattypes的红色,绿色和蓝色。 然后为颜色实体子类NSManagedObject。 (如果在使用核心数据之前,这听起来很熟悉)。但是,这不是一个关于如何使用核心数据的问题,所以我会去做的。

为了说明这个问题,我们将生成一个随机颜色并将其保存到核心数据中(您可以将RGB值设置为您希望的颜色)。

首先在你要使用的类的实现文件中创build三个floattypes的属性。

 @property (nonatomic) float randomRedColor; @property (nonatomic) float randomBlueColor; @property (nonatomic) float randomGreenColor; 

设置保存核心数据的方法,每个RGB值至less有3个floattypes的参数。 请记住,该实体属性必须是一个对象,而不是基本types,因此在设置键的值时,将您的浮点值包含在NSNumber中。

 -(void) withColors:(float)redColor withBlue:(float)blueColor withGreen:(float)greenColor{ //set up NSManagedObjectContext/EntityDescription/ManagedObject (core data) self.randomRedColor = redColor; self.randomBlueColor = blueColor; self.randomGreenColor = greenColor; [newCategory setValue:[NSNumber numberWithFloat:redColor] forKey:@"red"]; [newCategory setValue:[NSNumber numberWithFloat:blueColor] forKey:@"blue"]; [newCategory setValue:[NSNumber numberWithFloat:greenColor] forKey:@"green"]; //save new objects (core data) 

无论你打算调用这个方法,你都会创build三个随机值的浮点数,然后将它们传入:(我喜欢在数据源中设置所有这些,所以不要担心我的sharedInstance。对单例模式不熟悉,别担心,我只是简单地调用方法,并将随机生成的值传递给我们的参数。

 float red = (arc4random()%256/256.0); float blue = (arc4random()%256/256.0); float green = (arc4random()%256/256.0); [[DataSource sharedInstance] withColors:red withBlue:blue withGreen:green]; 

现在简单地导入你的Color NSManagedObject的头文件,并在这种情况下创build你的Color NSManagedObject属性,我们将其称为* color:

 @property (nonatomic, strong) Color *color 

假设任何人都知道如何执行取回请求,我们现在将使用我们在Color实体子类化时提供的* red * blue和* green属性。

 float red = [self.category.red floatValue]; float green = [self.category.green floatValue]; float blue = [self.category.blue floatValue]; 

剩下的就是将检索到的值存储在UIColor对象中:

 UIColor *randomRGBColor = [[UIColor alloc] initWithRed:red green:green blue:blue alpha:1.0]; 

现在你完成了。 您已经成功存储了UIColor对象。 我希望这有帮助!