2

リクエストの JSON 本文で緯度と経度の複数のキーを受け取りました。

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

それらを JSON モデルに変換しながら、それらを 1 つの CLLocation プロパティに結合したいと考えています。

#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

同じことを達成するにはどうすればよいですか?

4

1 に答える 1

2

最後にここで答えを見つけました。これは非常に独創的な方法であり、ドキュメントで明示的に言及されていないことに驚きました。

複数のキーを 1 つのオブジェクトに結合する方法は、+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]};
    }];
}
于 2016-01-31T10:36:06.953 に答える