0

有我的实施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"];

我将我的字段标记为可变形

在此处输入图像描述

我的 MO 中有一个属性

@property (nonatomic, strong) NSData *someData;

@dynamic someData;

我究竟做错了什么?transformedValue不叫。

4

1 回答 1

2

我在上面的评论中对您的问题做了一些假设。我在测试示例中复制了您的设置并发现以下内容:

  1. 您的设置是正确的 - 无需在运行时设置值转换器 EncryptionTransformer *transformer = [[EncryptionTransformer alloc] init]; [NSValueTransformer setValueTransformer:transformer forName:@"EncryptionTransformer"];
  2. 实际值变换器的变换方法-(id)transformedValue:被调用后-[NSManagedObjectContext save:]
  3. 此外,如果您NSManagedObjectContext没有直接连接到持久存储协调器(out-of-boxMagicalRecord 或 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:
于 2014-08-25T13:02:21.030 回答