哪里是将对象映射放在RestKit中的最佳位置

时间:2011-08-25 12:56:24

标签: objective-c object mapping restkit

我正在使用RestKit进行项目,我注意到类中不再有一个方法可以控制(elementToPropertyMappings)中的所有映射,因此我想知道放置新代码的最佳位置在哪里,目前我在我的视图控制器中这样做,但我会在我的代码的其他区域使用大多数相同的映射,所以有一个更有效的地方可以使用它:

我所指的代码是:

RKObjectMapping* userMapping = [RKObjectMapping mappingForClass:[User class]];
[userMapping mapKeyPath:@"id" toAttribute:@"identifier"];
[userMapping mapKeyPath:@"forename" toAttribute:@"forename"];
[userMapping mapKeyPath:@"surname" toAttribute:@"surname"];
[userMapping mapKeyPath:@"email" toAttribute:@"email"];
[userMapping mapKeyPath:@"twitter_username" toAttribute:@"twitterUsername"];
[userMapping mapKeyPath:@"created" toAttribute:@"created"];
[userMapping mapKeyPath:@"use_gravatar" toAttribute:@"useGravatar"];
[userMapping mapKeyPath:@"avatar_url" toAttribute:@"avatarURL"];
[userMapping mapKeyPath:@"gender" toAttribute:@"gender"];
[[RKObjectManager sharedManager].mappingProvider setMapping:userMapping forKeyPath:@"user"];

如果可以在User类的方法中然后调用以设置这些映射等,那将是很好的。

非常感谢

3 个答案:

答案 0 :(得分:9)

有一些很好的方法来组织目前推荐的映射:

  1. 将所有映射放入应用程序委托,并在应用程序初始化时配置它们。这使它们不受控制器的影响,如果您的映射数量很少,则非常有用。
  2. 对RKObjectMappingProvider进行子类化并在子类的init方法中构建所有映射,然后实例化并将映射提供程序实例分配给对象管理器。
  3. 使用类似'defineMappings'的方法向RKObjectMappingProvider添加类别。然后将标头导入到您的app委托中,并在初始化RestKit后通过[mappingProvider defineMappings]调用它。
  4. 在类方法上定义映射的问题在于,当您有关系时,您可以结束循环依赖关系,因为没有可用于存储实例的ivars。我们或许可以使用块来帮助缓解这个问题,但还没有做过这样的工作。

答案 1 :(得分:3)

我认为域模型应该是唯一应该了解映射的人。 这是我如何映射一些flickr json:

我在你需要它时调用映射(可以在AppDelegate或你想要的地方)

// Setup our object mappings
RKObjectMapping *photoMapping = [Photo mapWithMapping:nil];
RKObjectMapping *photosMapping = [Photos mapWithMapping:photoMapping];

这是我的域对象之一: 它包含执行映射的classMethod。

#import "Photos.h"
@implementation Photos

+ (RKObjectMapping*)mapWithMapping: (RKObjectMapping*)aMapping
{
    RKObjectManager *objectManager = [RKObjectManager sharedManager];
    RKManagedObjectMapping *mapping = [RKManagedObjectMapping mappingForClass:[self class] inManagedObjectStore:objectManager.objectStore];

    [mapping mapKeyPathsToAttributes:
         @"page", @"page",
         @"pages", @"pages",
         @"perpage", @"perpage",
         @"stat", @"stat",
         @"total", @"total",
     nil];

    if (aMapping) {
        [mapping mapRelationship:@"photo" withMapping:aMapping];
    }

    return mapping;
}

@end

答案 2 :(得分:1)

我通常在App Delegate中创建一个私有方法,我在app setup期间调用它来设置RKObjectManager,然后构建我在整个应用程序中使用的所有映射。我相信RestKit示例项目使用相同的模式,因此请务必将其作为参考。

相关问题