在 Restkit 0.2 中为给定类添加两个请求描述符

Posted

技术标签:

【中文标题】在 Restkit 0.2 中为给定类添加两个请求描述符【英文标题】:Adding two request descriptors for a given class in Restkit 0.2 【发布时间】:2013-01-06 06:54:37 【问题描述】:

我需要从 User 类创建两种不同类型的 POST。

//JSON Type A

    "password":"12345",
    "email":"test@gmail.com"


//JSON Type B

   "user":
      "Password":"12345",
      "Email":"sample@gmail.com"
   

我尝试创建两个请求描述符并将它们添加到我的对象管理器中,但是我得到了错误

"不能为同一对象类添加请求描述符作为 现有的请求描述符。”

我的代码

@interface User : NSObject

@property (nonatomic, retain) NSString * userID;
@property (nonatomic, retain) NSString * email;
@property (nonatomic, retain) NSString * password;
@property (nonatomic, retain) NSString * firstName;
@property (nonatomic, retain) NSString * lastName;

@end

- (void)setupUserMapping:(RKObjectManager *)objectManager 

    // Setup user response mappings
    RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[User class]];
    [userMapping addAttributeMappingsFromDictionary:@
     @"ID" :@"userID",
     @"Email" : @"email",
     @"Password" : @"password",
     @"FirstName" : @"firstName",
     @"LastName" : @"lastName",
     ];


    RKResponseDescriptor *responseDescriptorAuthenticate = [RKResponseDescriptor responseDescriptorWithMapping:userMapping
                                                                                       pathPattern:@"/Authenticate"
                                                                                           keyPath:nil
                                                                                       statusCodes:[NSIndexSet indexSetWithIndex:200]];


    RKResponseDescriptor *responseDescriptorRegister = [RKResponseDescriptor responseDescriptorWithMapping:userMapping
                                                                                                   pathPattern:@"/Register"
                                                                                                       keyPath:nil
                                                                                                   statusCodes:[NSIndexSet indexSetWithIndex:200]];
    [objectManager addResponseDescriptor:responseDescriptorRegister];
    [objectManager addResponseDescriptor:responseDescriptorAuthenticate];

    // Setup user request mappings
    RKObjectMapping* userRequestMappingForRegister = [RKObjectMapping requestMapping];
    [userRequestMappingForRegister addAttributeMappingsFromDictionary:@
     @"email" : @"Email",
     @"password" : @"Password",
     @"firstName" : @"FirstName",
     @"lastName" : @"LastName",
     ];
    RKRequestDescriptor *requestDescriptorForRegister = [RKRequestDescriptor requestDescriptorWithMapping:userRequestMappingForRegister objectClass:[User class] rootKeyPath:@"user"];


    RKObjectMapping* userRequestMappingForAuthenticate = [RKObjectMapping requestMapping];
    [userRequestMappingForAuthenticate addAttributeMappingsFromDictionary:@
     @"userID" :@"ID",
     @"email" : @"email",
     @"password": @"password"
     ];
    RKRequestDescriptor *requestDescriptorForAuthenticate = [RKRequestDescriptor requestDescriptorWithMapping:userRequestMappingForAuthenticate objectClass:[User class] rootKeyPath:nil];

    [objectManager addRequestDescriptor:requestDescriptorForRegister];
    [objectManager addRequestDescriptor:requestDescriptorForAuthenticate];

有谁知道我如何在不为这些请求创建单独的类的情况下解决这个问题?

感谢任何帮助。

谢谢。

【问题讨论】:

【参考方案1】:

您可以使用动态映射来切换序列化行为。如果这是一个足够普遍的问题,我们可以想象将路径匹配添加到请求描述符。我只是没有对这样的功能提出很多要求。

在单元测试中有一个如何在请求中使用动态映射的示例:https://github.com/RestKit/RestKit/blob/master/Tests/Logic/ObjectMapping/RKObjectParameterizationTest.m#L495-L534

【讨论】:

感谢布莱克的例子!我希望它成为一个普遍的问题! =) Blake - 我最近遇到了同样的问题并使用了两个 ObjectManager 实例(当然它们用于非常不同的对象)。这是推荐的最佳做法吗? “如果这是一个足够普遍的问题,我们可以想象将路径匹配添加到请求描述符” - 如果这可以被认为是一个功能提议,+1 :) 在回答时永久链接到测试源代码:github.com/RestKit/RestKit/blob/…【参考方案2】:

对于多个请求描述符,我声明了一个新的模型类,其数据成员与前一个相同,然后在添加请求描述符时引用它而不是前一个,如下所示。

    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[CMAGoogleUserDataModel class]];

这里新创建的类是“CMAGoogleUserDataModel”

注意:我不确定它是否是优化的,但它确实解决了我的用例。

【讨论】:

以上是关于在 Restkit 0.2 中为给定类添加两个请求描述符的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 0.2x 同时 RKManagedObjectRequestOperation

如何在 RESTkit 0.2 中设置缓存策略

RestKit 0.2 'NSInternalInconsistencyException',原因:'无法为 keyPath scheduleEntries 添加映射,一个已经存在...'

使用 RestKit 0.2x 创建两个独立的持久存储

无法让 RestKit 0.2 发布参数

RestKit:映射类在 Swift 中为零