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

8

我正在使用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个回答

9

目前有几种很好的方法可以组织你的映射:

  1. 将所有的映射放到你的应用委托中,并在应用程序初始化时配置它们。这样可以将其从控制器中分离出来,如果你只有少量映射,这是非常有用的。
  2. 子类化RKObjectMappingProvider,并在你的子类的init方法中构建所有映射,然后实例化和分配你的映射提供者实例到对象管理器。
  3. 向RKObjectMappingProvider添加一个类别,像“defineMappings”一样的方法。然后在应用委托中导入头文件,并通过[mappingProvider defineMappings]调用它在你初始化RestKit之后。

在类方法上定义映射的问题在于当你有关系时,你可能会遇到循环依赖问题,因为没有ivars可用于存储实例。我们可能能够使用块来帮助缓解这个问题,但这方面的工作尚未完成。


1
过去,我只创建了一个RestKitManager和MappingsManager对象,将设置移出了我的应用程序委托。MappingsManager保留对我定义的每个映射的引用,并为RestKitManager提供单一入口来启动和设置映射,以便RestKitManager和AppDelegate都不需要知道涉及的实体数量的任何细节。然而,子类化映射提供程序似乎是一种更优雅的方法。我以前没有考虑过这一点。 - Greg Combs
不想劫持这个问题,我在这里问了一个非常相关的问题:https://dev59.com/GlvUa4cB1Zd3GeqPrTcX - Glenn

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

1
通常我会在我的应用程序委托中创建一个私有方法,在应用程序设置期间调用该方法,以设置RKObjectManager,然后构建我在整个应用程序中使用的所有映射。我相信RestKit示例项目也使用了这种模式,因此一定要查看它们作为参考。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接