3

カスタム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
4

1 に答える 1

0

意図したとおりに変換可能な属性を実際に使用していません。あなたの方法は理論的にはうまくいくはずですが、それは醜い恨みです。

通常、非標準の処理を実行する場合は、システム定義クラスのカスタム値トランスフォーマーを作成するだけで済みます。ほとんどの場合、推奨される方法は、デフォルトのNSKeyedUnarchiveFromDataTransformerNameを使用することです。NSCodingプロトコルを実装するすべてのクラスは、その値トランスフォーマーを使用できます。

UIColorはNSCodingプロトコルを実装しているため、属性を「transformable」に設定するだけでNSKeyedUnarchiveFromDataTransformerName、トランスフォーマー名が自動的に入力されます(少なくとも、Xcode 3.xでは設定されています)。使用中、CoreDataは適切なアクセサーを作成します。他のキーと同じようにUIColor属性を設定および取得できます。

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

経験則として、APIクラスの場合、APIがほとんどの作業を行います。システムクラスで一生懸命働いていることに気付いた場合は、おそらく何かを見逃しているでしょう。

于 2011-06-10T13:58:31.187 に答える