カスタムNSValueTransformerを使用して、コアデータストアに色情報を保存しています。TransformableデータとUIColorインスタンスの間の変換は、カラーデータが既にストアにある場合(つまり、アプリが実行されて終了した場合)にうまく機能します。ただし、最初にアプリを実行してこれらの値を(テキストファイルから)ロードすると、NSCFStringとして「スタック」します。
このコード行の「属性」は、NSManagedObject属性名であるキーと、それらの属性の期待値である値を持つディクショナリです。私の色の例では、キーと値のペアは「color」:「1,1,1,0.5」です。
[object setValue:[attributes valueForKey:attribute] forKey:attribute];
「color」の値は、NSValueTransformerを介して変換され、アプリが再度実行されたときにUIColorに再変換されるまで、このインスタンスでは文字列のままになります。
ここでは、NSValueTransformerで実行しているのと同じ変換を実行できますが、これは、理論的にはすべてのトランスフォーマーに使用できる、作成したユーティリティクラスに含まれています。また、新しく作成されたすべてのNSManagedObjectインスタンスをメモリから取り出して、変換を強制的に実行する方法を見つけることも考えましたが、それはハックのようです。
注:この「ハック」は私にとってはうまくいきます。続けましょう。それでも醜い感じがします。同様の問題が発生している場合や「正常に機能する」解決策を探している場合は、NSManagedObjectContextのresetメソッドを使用してください。
何か案は?
(これは「変換可能なCore Data属性がカスタム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