RKCLLocationValueTransformer 1.1.0

RKCLLocationValueTransformer 1.1.0

测试已测试
语言语言 Obj-CObjective C
许可证 Apache 2
发布最后发布2014 年 12 月

Blake Watters 维护。



  • Blake Watters

一个符合 RKValueTransforming 的类,用于在地理坐标的 NSDictionaryCLLocation 表示之间转换值。

RKCLLocationValueTransformer 是一个简单的类,它提供在 NSDictionaryCLLocation 表示之间转换地理坐标数据的功能。它建立在 RKValueTransformers 的基础上,设计用于与 RestKit 一起使用。该转换器使用一组指定 latitude 和 longitude 在字典中如何存储的键进行初始化。一旦转换器在 RestKit 中注册,您就可以在处理 Web 服务 API 时透明地映射 CLLocation 值。

示例

用法

基本用法与其他所有 RKValueTransforming 类相同。

#import "RKCLLocationValueTransformer.h"

RKCLLocationValueTransformer *locationValueTransformer = [RKCLLocationValueTransformer locationValueTransformerWithLatitudeKey:@"latitude" longitudeKey:@"longitude"];

// Transforming NSDictionary -> CLLocation
CLLocation *location = nil;
NSError *error = nil;
BOOL success = [locationValueTransformer transformValue:@{ @"latitude": @"40.7680", @"longitude": @"73.9819" } toValue:&location ofClass:[CLLocation class] error:&error];

// Transforming CLLocation -> NSDictionary
NSDictionary *dictionary = nil;
CLLocation *location = [[CLLocation alloc] initWithLatitude:40.7680 longitude:73.9819];
success = [valueTransformer transformValue:location toValue:&dictionary ofClass:[NSDictionary class] error:&error];

注册为默认值转换器

地点转换器可以与默认值转换器注册,以供全局使用。

#import "RKCLLocationValueTransformer.h"

RKCLLocationValueTransformer *locationValueTransformer = [RKCLLocationValueTransformer locationValueTransformerWithLatitudeKey:@"latitude" longitudeKey:@"longitude"];
[[RKValueTransformer defaultValueTransformer] addValueTransformer:locationValueTransformer];

与 RestKit 集成

需要 RestKit v0.21.0 及以上*

RKCLLocationValueTransformer 类主要是为与 RestKit 一起使用而设计的,以启用 API 中的坐标数据对象映射。要这样做,您必须配置 RKAttributeMapping 以使用值转换器,对于 CLLocation 属性。下面的示例详细介绍了如何进行此配置。

从 JSON 映射到 CLLocation 属性

{
    "user": {
        "name": "Blake Watters",
        "location": {
            "latitude": "40.708",
            "longitude": "74.012"
        }
    }
}

假设以上 JSON,您可以按如下方式配置对象映射和请求描述符以访问数据

#import "RKCLLocationValueTransformer.h"

@interface User : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) CLLocation *location;
@end

RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[User class]];
[userMapping addAttributeMappingsFromArray:@[ @"name" ]];
RKAttributeMapping *attributeMapping = [RKAttributeMapping attributeMappingFromKeyPath:@"location" toKeyPath:@"location"];
attributeMapping.valueTransformer = [RKCLLocationValueTransformer locationValueTransformerWithLatitudeKey:@"latitude" longitudeKey:@"longitude"];
[userMapping addPropertyMapping:attributeMapping];

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:userMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"user" statusCodes:[NSIndexSet indexSetWithIndex:200]];

请求成功完成后,将创建 User 类型的实例,并且 name 属性等于 @"Blake Watters",并且 location 属性将是一个 CLLocation 实例,其 latitudelongitude 属性分别等于 40.70874.012

从 CLLocation 属性映射到 HTTP 参数

将本地域对象映射回NSDictionary以供PUTPOSTPATCH操作使用需要稍微更多的配置。因为在将本地对象映射到NSDictionary时没有类型提示可用(因为没有属性可以反射),我们必须明确告诉RestKit我们想要如何表示CLLocation对象,以便值转换器能够处理它

RKObjectMapping *userRequestMapping = [RKObjectMapping requestMapping];
[userRequestMapping addAttributeMappingsFromArray:@[ @"name" ]];
RKAttributeMapping *attributeMapping = [RKAttributeMapping attributeMappingFromKeyPath:@"location" toKeyPath:@"location"];
attributeMapping.propertyValueClass = [NSDictionary class];
attributeMapping.valueTransformer = [RKCLLocationValueTransformer locationValueTransformerWithLatitudeKey:@"latitude" longitudeKey:@"longitude"];
[userRequestMapping addPropertyMapping:attributeMapping];

NSError *error = nil;
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:userRequestMapping objectClass:[User class] rootKeyPath:@"user" method:RKRequestMethodAny];

执行POSTPUT后,您将获得一个与上面给出的原始JSON示例匹配的JSON或URL表单编码表示。

鸣谢

Blake Watters

许可证

RKCLLocationValueTransformer在Apache 2许可证下可用。有关更多信息,请参阅LICENSE文件。