Невозможно сделать 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 ответ

Решение

Я высказал некоторые предположения о вашей проблеме в комментарии выше. Я воспроизвел ваши настройки в тестовом примере и обнаружил следующее:

  1. Ваша настройка правильная - и нет необходимости настраивать преобразователь значения во время выполнения, какEncryptionTransformer *transformer = [[EncryptionTransformer alloc] init]; [NSValueTransformer setValueTransformer:transformer forName:@"EncryptionTransformer"];
  2. Метод преобразования действительного значения трансформатора -(id)transformedValue: называется после -[NSManagedObjectContext save:]
  3. Более того, если вы NSManagedObjectContext напрямую не связан с постоянным координатором магазина (популярный подход предоставлен out-of-box в рамках, таких как MagicalRecord или RestKit) -(id)transformedValue: не называется после -[NSManagedObjectContext save:], Вызывается только после -[NSManagedObjectContext save:] в контексте, который напрямую связан с постоянным координатором магазина.
  4. Для -(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:
Другие вопросы по тегам