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 类的一个方法中,然后我可以调用它来设置这些映射等,那就太好了。

非常感谢

4

3 回答 3

9

目前推荐有几种组织映射的好方法:

  1. 将所有映射放入您的应用程序委托并在应用程序初始化时配置它们。这使它们远离控制器,并且在您有少量映射时很有用。
  2. 子类化 RKObjectMappingProvider 并在子类的 init 方法中构建所有映射,然后实例化映射提供程序实例并将其分配给对象管理器。
  3. 使用“defineMappings”之类的方法将类别添加到 RKObjectMappingProvider。然后将标头导入您的应用程序委托,并在初始化 RestKit 后通过 [mappingProvider defineMappings] 调用它。

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

于 2011-08-25T13:25:44.660 回答
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
于 2012-10-15T16:25:08.897 回答
1

我通常在我的 App Delegate 中创建一个私有方法,我在应用设置期间调用它来设置 RKObjectManager,然后构造我在整个应用中使用的所有映射。我相信 RestKit 示例项目使用相同的模式,所以一定要检查这些作为参考。

于 2011-08-25T13:26:18.027 回答