测试已测试 | ✓ |
语言语言 | Obj-CObjective C |
许可证 | Apache 2 |
发布最后发布 | 2014 年 12 月 |
由 Blake Watters 维护。
一个符合 RKValueTransforming
的类,用于在地理坐标的 NSDictionary
和 CLLocation
表示之间转换值。
RKCLLocationValueTransformer 是一个简单的类,它提供在 NSDictionary
和 CLLocation
表示之间转换地理坐标数据的功能。它建立在 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 v0.21.0 及以上*
RKCLLocationValueTransformer
类主要是为与 RestKit 一起使用而设计的,以启用 API 中的坐标数据对象映射。要这样做,您必须配置 RKAttributeMapping
以使用值转换器,对于 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
实例,其 latitude
和 longitude
属性分别等于 40.708
和 74.012
。
将本地域对象映射回NSDictionary
以供PUT
、POST
或PATCH
操作使用需要稍微更多的配置。因为在将本地对象映射到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];
执行POST
或PUT
后,您将获得一个与上面给出的原始JSON示例匹配的JSON或URL表单编码表示。
Blake Watters
RKCLLocationValueTransformer在Apache 2许可证下可用。有关更多信息,请参阅LICENSE文件。