2014-12-27 24 views
1

这是我有:Restkit:RKValueTransformer transformationBlock不叫

在我的JSON响应

我有一组选项: Options : ["red","green", "blue"]

我想将其转换为字符串:options = @"red, green, blue";(我已经将menuComponent实体的options属性定义为'NSString')

我已经为该属性提供了一个customValueTransformer,但不会调用transformationBlock。 有没有人有任何想法我做错了什么?

RKEntityMapping *menuComponentMapping = [RKEntityMapping mappingForEntityForName:@"MenuComponent" inManagedObjectStore:managedObjectStore]; 

menuComponentMapping.identificationAttributes = @[@"menuComponentID"]; 
[menuComponentMapping addAttributeMappingsFromDictionary:@{ 
                  @"ID":@"menuComponentID", 
                  @"Name":@"name", 
                  @"Description":@"descriptions", 
                  @"Thumbnail":@"thumbnail" 
                  }]; 
//every menu component have some options 
RKAttributeMapping *optionsMapping = [RKAttributeMapping attributeMappingFromKeyPath:@"Options" toKeyPath:@"options"]; 

//converting options to string 
RKValueTransformer *arrayToStringTransformer = [RKBlockValueTransformer valueTransformerWithValidationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) { 
    // I don't know check what with what! 
    return ([sourceClass isSubclassOfClass:[NSNumber class]] && [destinationClass isSubclassOfClass:[NSString class]]); 
} transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, Class outputValueClass, NSError *__autoreleasing *error) { 
    // Validate the input and output 

    // Perform the transformation 
// iterating through options and append to a string 

    return YES; 
}]; 

//adding custom value transformer 
optionsMapping.valueTransformer = arrayToStringTransformer; 
//adding optionsMapping 
[menuComponentMapping addPropertyMapping:optionsMapping]; 
[[RKValueTransformer defaultValueTransformer] insertValueTransformer:arrayToStringTransformer atIndex:0]; 

RKRelationshipMapping *menuComponentRelationShip = [RKRelationshipMapping relationshipMappingFromKeyPath:@"MenuComponents" toKeyPath:@"children" withMapping:menuComponentMapping]; 

//adding menucomponent children relationship to menuComponent 
[menuComponentMapping addPropertyMapping:menuComponentRelationShip]; 

return menuComponentMapping; 
} 

回答

0

你的代码甚至注释本节作为一个问题:

// I don't know check what with what! 
return ([sourceClass isSubclassOfClass:[NSNumber class]] && [destinationClass isSubclassOfClass:[NSString class]]); 

,因为你是不是想从NSNumber转换,你想从一个NSArray转换。如果类型不匹配,则不会使用变压器。

如果该块没有被调用,那么问题出在变换器注册。这应该不会发生变压器直接提供给映射,但你没有显示如何使用映射...

+0

我有一个restaurantEntity与menuComponentEntity有关系。在我的responseDescriptor中,我提供了我的restaurantMapping和一个webApi url。 restaurantManager在没有任何问题的情况下加载所有数据。选项'valueTransformerWithValidationBlock'调用两次:第一次目的地是NSString类,sourceClass是NCSFString类,第二次destinationClass是NSNumber类,源类是'NSCFNumber'类,但转换类不被调用。如果例如将自定义值转换器添加到另一个属性(如“name”),则会调用变换块! – 2014-12-28 19:46:56

+0

打开跟踪日志记录。数据模型中设置了哪种数据类型?而托管对象类是自动生成的? – Wain 2014-12-28 22:45:28