2014-05-23 56 views
9

我想将UIColor对象作为属性存储在核心数据实体上,然后检索它并以与我在该实体上的其他属性相同的方式使用它。在核心数据中存储UIColor对象

在我的研究,而文学似乎相当稀疏​​,我发现this post说,该属性应被指定为“可转换”,并且该数据应该是手动转换使用NSKeyedArchiver和出山使用NSKeyedUnarchiver去。

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

Apple docs themselves去存储和检索NSColor对象的一些细节,但不是(我可以找到)在UIColor。但是,它听起来像在CD中自动处理归档/解除归档。也许。我对此行感到困惑:

如果您在Xcode中使用模型编辑器,请在属性的类型弹出框中选择Transformable,然后在Value Transformer Name文本字段中键入名称。

我以为他们谈论的是属性的名称,但我不知道,特别是因为它发出警告,从明确指定变压器产生的潜在问题:

要点:虽然默认变压器是由NSKeyedUnarchiveFromDataTransformerName指定的变压器,这个变压器实际上是反向使用的。如果明确指定默认转换器,Core Data将使用“错误的方向”。

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

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

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

非常感谢您的帮助!

回答

26

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

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

Like so

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

+0

谢谢,@quellish!我猜这肯定是一个相对较新的创新,因为之前的参考文献似乎指向了更严格的措施。 – rattletrap99

+0

不,在那里呆了很长很长的时间。 – quellish

+0

感谢您的帮助,先生(或女士,视情况而定)。完美的作品! – rattletrap99

1

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

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

为了论证的缘故,我们将生成一个随机颜色并将其保存到核心数据(您可以将RGB值设置为您希望的任何颜色)。

首先在您将要使用它的任何类的实现文件中创建三个float类型的属性。

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

设置保存核心数据的方法,至少为每个RGB值使用3个float类型的参数。请记住,该实体属性必须是一个对象,而不是基本类型,因此在为键设置值时,将您的浮点值包含在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) 

无论你打算调用此方法,你将创建三个彩车用随机值,并通过他们在:(我喜欢做这一切的数据源设置,所以不用担心我的sharedInstance。如果你不熟悉Singleton模式,不用担心,我只是简单地调用该方法,并在随机生成的值传递为我们的论点。)

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的头文件并在这种情况下创建你的Color NSManagedObject属性,我们将其称为* color:

@property (nonatomic, strong) Color *color 

假设有人读这知道如何执行读取请求时,我们现在将使用我们的*红色*的蓝色和绿色*当我们的子类我们的颜色实体已提供的属性。

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对象。我希望这有帮助!

4

提供另一种选择,斯威夫特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 
+2

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