3

我正在使用自定义NSValueTransformer将颜色信息存储在我的Core Data存储中。一旦颜色数据已经存储在商店中(即一旦应用程序已经运行并退出一次),Transformable数据和UIColor实例之间的转换就非常有效。但是,当我第一次运行应用程序并加载这些值时(来自文本文件),它们“卡住”为NSCFStrings。使用NSValueTransformer设置NSManagedObject实例的值

在这行代码中,“属性”是一个字典,其中包含NSManagedObject属性名称和值,这些属性值是这些属性的期望值。在我的颜色例子键值对是“彩色”:“1,1,1,0.5”

[object setValue:[attributes valueForKey:attribute] forKey:attribute]; 

为“颜色”的值将在现在这种情况下仍然是一个字符串,直到它得到通过我NSValueTransformer转化然后在应用程序再次运行时重新转换为UIColor。

我可以在这里做同样的转换,我在NSValueTransformer中做,但这是在我写的实用程序类中,理论上可以用于任何变压器。我也想过找到一种方法将所有新创建的NSManagedObject实例放到内存中,从而强制转换通过,但这看起来像是一种破解。

注意:这个“黑客”适用于我,让我继续,但仍然感到难看。如果您遇到类似问题/寻找“正常工作”解决方案,请使用NSManagedObjectContext的重置方法。

任何想法?

(我有一种预感,这是类似“Why is my transformable Core Data attribute not using my custom NSValueTransformer?”,但标题之外我们的问题似乎是不同的)

这里是我的NSValueTransformer

@implementation UIColorRGBValueTransformer 

+ (Class)transformedValueClass 
{ 
    return [NSData class]; 
} 

+ (BOOL)allowsReverseTransformation 
{ 
    return YES; 
} 

- (id)transformedValue:(id)value 
{ 
    return [value dataUsingEncoding:NSUTF8StringEncoding]; 
} 

- (id)reverseTransformedValue:(id)value 
{ 
    NSString *colorAsString = [[[NSString alloc] initWithData:value encoding:NSUTF8StringEncoding] autorelease]; 
    NSArray *components = [colorAsString componentsSeparatedByString:@","]; 
    CGFloat r = [[components objectAtIndex:0] floatValue]; 
    CGFloat g = [[components objectAtIndex:1] floatValue]; 
    CGFloat b = [[components objectAtIndex:2] floatValue]; 
    CGFloat a = [[components objectAtIndex:3] floatValue]; 
    return [UIColor colorWithRed:r green:g blue:b alpha:a]; 

    return nil; 
} 

@end 
+0

说明:你是什么意思“......他们”卡住“作为NSCFStrings。”你的意思是你只能得到字符串值,直到你保存上下文? – TechZen 2011-06-10 14:00:07

+0

是的,这些值在第一次执行期间是NSCFString类型的,但是从那时起UIColors就是这样。 – rob5408 2011-06-10 16:38:31

回答

0

你真的不使用可预测的可变形属性。你的方法应该在理论上工作,但它是一个丑陋的混乱。

当你想做非标准的事情时,你通常只需要为系统定义的类写一个自定义值转换器。在绝大多数情况下,首选方法是使用默认的NSKeyedUnarchiveFromDataTransformerName。任何实现NSCoding协议的类都可以使用该值转换器。由于UIColor确实实现了NSCoding协议,因此您可以将该属性设置为'transformable'并且NSKeyedUnarchiveFromDataTransformerName将自动填充变换器名称(至少在Xcode 3.x中是这样做的)。在使用中,Core Data将创建适当的访问,所以你可以设置和获取的UIColor属性,就像任何其他键:

[aMoObject setValue:aUIcolorObj forKey:@"colorAttributeName"]; 

作为一个很好的经验法则,API会做的大部分工作,为您的API类的情况。如果你发现自己在系统课上努力工作,你可能错过了一些东西。

+0

感谢您的回复。我最初得出了原因,因为这里的答案“http://stackoverflow.com/questions/2304882/core-data-data-model-attribute-type-for-uicolor”明确表示UIColor不符合NSCoding。不幸的是,我从来没有想过要为自己检查“事实”。不知何故,这一切都最终为我工作,因为颜色的原始数据来源于(文本文件中的1,1,1,0.5)。我想我会删除转换器,并找出一种方便的方式将UIColor作为文本存储在我的json文件中,然后让系统将其存储并存储。 – rob5408 2011-06-10 16:45:52