Невозможно сделать transformValue, вызываемый в NSValueTransformer
Есть моя реализация NSValueTransformer
+ (Class)transformedValueClass {
return [NSData class];
}
+ (BOOL)allowsReverseTransformation {
return YES;
}
- (id)transformedValue:(id)value {
// some implementation, there is breakpoint
}
- (id)reverseTransformedValue:(id)value {
// some implementation, there is breakpoint
}
Я регистрирую это во время выполнения
EncryptionTransformer *transformer = [[EncryptionTransformer alloc] init];
[NSValueTransformer setValueTransformer:transformer forName:@"EncryptionTransformer"];
Я отмечаю свое поле как Transformable
И есть собственность в моем МО
@property (nonatomic, strong) NSData *someData;
@dynamic someData;
Что я делаю неправильно? transformedValue
не называется.
1 ответ
Решение
Я высказал некоторые предположения о вашей проблеме в комментарии выше. Я воспроизвел ваши настройки в тестовом примере и обнаружил следующее:
- Ваша настройка правильная - и нет необходимости настраивать преобразователь значения во время выполнения, как
EncryptionTransformer *transformer = [[EncryptionTransformer alloc] init]; [NSValueTransformer setValueTransformer:transformer forName:@"EncryptionTransformer"];
- Метод преобразования действительного значения трансформатора
-(id)transformedValue:
называется после-[NSManagedObjectContext save:]
- Более того, если вы
NSManagedObjectContext
напрямую не связан с постоянным координатором магазина (популярный подход предоставленout-of-box
в рамках, таких как MagicalRecord или RestKit)-(id)transformedValue:
не называется после-[NSManagedObjectContext save:]
, Вызывается только после-[NSManagedObjectContext save:]
в контексте, который напрямую связан с постоянным координатором магазина. - Для
-(id)reverseTransformedValue:(id)value
аналогичные правила верны - он вызывается только после извлечения из координатора постоянного хранилища
Простой код (я использую ваши настройки):
char *data = "abc";
NSManagedObjectContext *moc =
[(TCDAppDelegate*)[[UIApplication sharedApplication] delegate] managedObjectContext];
Event *event = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Event class]) inManagedObjectContext:moc];
event.timeStamp = [NSDate date];
event.myData = [NSData dataWithBytes:data length:4]; // no call to -(id)transformedValue:
[moc save:nil]; // called -(id)transformedValue: