在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的对象。
- 将该属性标记为types“Tranformable”。
- 可选:将值转换器名称设置为“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对象。 我希望这有帮助!