2011-08-25 154 views
8
我使用RestKit一个项目

最好的地方,我注意到,有不再是你可以控制所有的映射(elementToPropertyMappings)类的方法,所以我想知道其中的把新的代码最好的地方是,我目前做这件事在我的视图控制器,但我会用最我的代码其他地区相同的映射关系,从而有把它更有效率的地方:哪里是把对象映射在RestKit

我所指的代码是:

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"]; 

这将是巨大的,如果这可能是在用户类中的方法,我可以再调用设置这些地图坪等

非常感谢

回答

9

有几个很好的方式来组织你的映射目前推荐:

  1. 把你所有的映射到您的应用程序代理,并在应用程序初始化配置。这将它们排除在控制器之外,并且在映射数量少的情况下非常有用。
  2. 子类的RKObjectMappingProvider和建设都在你的子类的init方法的映射,然后实例化你的映射提供程序实例分配给对象管理器。
  3. 添加类别RKObjectMappingProvider与像“defineMappings”的方法。然后将头文件导入到您的应用程序委托中,并在初始化RestKit后通过[mappingProvider defineMappings]调用它。

在类方法上定义映射的问题在于,当你有关系时,可以用循环依赖关闭,因为没有ivars可用于存储实例。我们或许可以用块做些事情来帮助缓解这个问题,但是还没有完成这样的工作。

+1

在过去,我刚刚创建了一个RestKitManager和一个MappingsManager对象来将设置移出我的应用程序委托。映射管理器保持对我定义的每个映射的引用,它为RestKitManager提供了一个单一的入口点来启动和设置映射,以便RestKitManager和AppDelegate都不需要知道任何关于涉及的实体数量。 *然而,*映射提供者的子类似乎是一种更优雅的方法。我以前没有考虑过这个。 –

+0

不想劫持这个问题我问了一个非常密切相关的问题在这里:http://stackoverflow.com/questions/7399095/where-to-put-object-mappings-in-restkit – Glenn

1

我通常会创建我的应用程序委托私人的方法,我的应用程序设置,其中设置了RKObjectManager,然后构建所有我整个应用程序使用的映射过程中调用。我相信RestKit示例项目使用这种相同的模式,所以绝对检查这些作为参考。

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