Я использую пользовательский NSValueTransformer для хранения информации о цвете в моем Базовом хранилище данных.Преобразование между преобразуемыми данными и экземпляром UIColor прекрасно работает, когда данные о цветах уже находятся в хранилище (т. Е. После того, как приложение было запущено и завершило работу уже один раз).Однако, когда я впервые запускаю приложение и загружаю эти значения (из текстового файла), они «застряли» как NSCFStrings.
В этой строке кода «атрибуты» словарь имеет ключи, которые являются именами атрибутов NSManagedObjectи значения, которые являются ожидаемыми значениями для этих атрибутов.В моем примере цвета пара ключ-значение «color»: «1,1,1,0.5»
[object setValue:[attributes valueForKey:attribute] forKey:attribute];
Значение «color» теперь будет оставаться строкой в этом случае, пока не будет преобразовано с помощьюмой NSValueTransformer и затем повторно преобразован в UIColor, когда приложение запускается снова.
Я мог бы просто сделать то же самое преобразование здесь, что я делаю в NSValueTransformer, но это в служебном классе, который я написал, который теоретически могиспользоваться для любого трансформатора.Я также подумал о том, чтобы найти способ вытащить из памяти все вновь созданные экземпляры NSManagedObject, тем самым вынудив преобразование пройти, но это выглядит как хак.
Примечание: этот "хак" работает для меня, и давайте продолжим, но все еще чувствую себя ужасно.Используйте метод сброса NSManagedObjectContext, если у вас есть похожие проблемы или вы ищете решение «просто работа».
Любые идеи?
(У меня есть догадка, это похоже на " Почемумой трансформируемый атрибут 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