サーバーサイドに問い合わせてテーブルをJSONで取得しているとします。
データの例
Product
id
name
typeId
Type
id
name
ProductのtypeIdはTypeのidを参照しています。
このデータをCoreDataに登録してCocoaBindingsでUIに表示するとしましょう。
通常はProductを登録するときにRelationを使用してtypeIdを差し替えると思います。(Typeの方も)
CoreData Entity
Product
id
name
type <--> Type
Type
id
name
products <--> Product
これでわかりますかね。ProductのtypeがRelationになっていて、Typeのインスタンスが登録されます。
ところがこれ登録するのが結構面倒です。
ですので、これをNSValueTransFormer を使って擬似的に実装します。
CoreData Entityは
Product
id
name
typeId
Type
id
name
JSONをそのまま登録。
Typeのidをnameに変換するValue Transformerを作成。
@interface TypeTransformer : NSValueTransformer
@end
@implementation TypeTransformer
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[NSValueTransformer setValueTransformer:[self new] forName:@"TypeTransformer"];
});
}
- (id)transformedValue:(id)value
{
if(![value isKindOfClass:[NSNumber class]]) return nil;
NSManagedObjectContext *context; // ManagedObjectContextがここに入っているとします
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Type"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id = %@", value];
[request setPredicate:predicate];
NSArray *array = [context executeFetchRequest:request error:NULL];
if([array count] == 0) return nil;
return [array[0] valueForKey:@"name"];
}
@end
これで、CocoaBindingsのkeyPathにtypeIdを指定し、ValueTransformerにTypeTransformerを指定すれば、そのidのTypeのnameが取得(表示)できるようになります。
Typeに複数のカラムがある場合はその数だけNSValueTransformerを作成すればOKです。