使用Mantle将多个键组合成单个属性

时间:2016-01-31 08:01:33

标签: objective-c github-mantle

我在JSON正文中收到了多个用于请求的纬度和经度键。

{
  ...
  latitude: "28.4949762000",
  longitude: "77.0895421000"
}

我想将它们组合成一个CLLocation属性,同时将它们转换为我的JSON模型:

#import <Mantle/Mantle.h>
@import CoreLocation;

@interface Location : MTLModel <MTLJSONSerializing>

@property (nonatomic, readonly) float latitude;
@property (nonatomic, readonly) float longitude;       //These are the current keys

@property (nonatomic, readonly) CLLocation* location;  //This is desired

@end

我如何实现同样目标?

1 个答案:

答案 0 :(得分:2)

终于找到了答案here。这是一种非常巧妙的方式,我很惊讶地发现它没有在文档中明确提及。

将多个键组合到单个对象中的方法是使用+JSONKeyPathsByPropertyKey方法中的数组将目标属性映射到多个键。当您这样做时,Mantle将在他们自己的NSDictionary实例中提供多个密钥。

+(NSDictionary *)JSONKeyPathsByPropertyKey
{
    return @{
             ...
             @"location": @[@"latitude", @"longitude"]
             };
}

如果目标属性是NSDictionary,则需要进行设置。否则,您需要在+JSONTransformerForKey+propertyJSONTransformer方法中指定转化。

+(NSValueTransformer*)locationJSONTransformer
{
    return [MTLValueTransformer transformerUsingForwardBlock:^CLLocation*(NSDictionary* value, BOOL *success, NSError *__autoreleasing *error) {

        NSString *latitude = value[@"latitude"];
        NSString *longitude = value[@"longitude"];

        if ([latitude isKindOfClass:[NSString class]] && [longitude isKindOfClass:[NSString class]])
        {
            return [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]];
        }
        else
        {
            return nil;
        }

    } reverseBlock:^NSDictionary*(CLLocation* value, BOOL *success, NSError *__autoreleasing *error) {

        return @{@"latitude": value ? [NSString stringWithFormat:@"%f", value.coordinate.latitude] : [NSNull null],
                 @"longitude": value ? [NSString stringWithFormat:@"%f", value.coordinate.longitude]: [NSNull null]};
    }];
}