使用 RestKit 创建子对象

Posted

技术标签:

【中文标题】使用 RestKit 创建子对象【英文标题】:Create child object with RestKit 【发布时间】:2014-01-05 17:56:47 【问题描述】:

我是 RestKit 的新手,但到目前为止一切似乎都说得通,我已经为这样的 User 对象设置了一些对象映射

+ (NSArray *) responseDecriptorsForEntityMapping:(RKEntityMapping *)entityMapping

    NSDictionary *mappings = @
                               @"id": @"userID",
                               @"firstName": @"forename",
                               @"lastName": @"surname",
                               @"phoneNumber": @"phone",
                               @"emailId": @"email",
                               @"uri": @"uri",
                               ;

    [entityMapping addAttributeMappingsFromDictionary:mappings];
    [entityMapping setIdentificationAttributes:@[@"userID"]];
    // Setup response descriptors
    RKResponseDescriptor *getDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping
                                                                                       method:RKRequestMethodGET
                                                                                  pathPattern:@"users/:userID"
                                                                                      keyPath:nil
                                                                                  statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

    return @[getDescriptor];

这是从另一个为对象管理器设置映射的类调用的。这工作正常,并且从服务器查询用户对象工作正常,这很好。

我现在想要的是创建一个子记录。我的User 对象包含与devices 的关系。我现在要做的是创建一个新的Device 对象并将其插入到用户的devices 集合中。

有没有一种方法可以创建不需要我指定整个 URL(即 /users/:userID/devices)并让 RestKit 自动计算的映射?

如果不是,那没关系,我可以手动设置,但是第二个问题,创建对象并将其放入集合的一般技术是什么?我是否可以像往常一样创建对象,然后一旦成功创建,只需使用正常的核心数据方法来添加新设备,还是可以配置 RestKit 为我做这件事?

【问题讨论】:

您收到的是什么 JSON?您是否考虑过将路线与您的路径模式一起使用? 我简要了解了路线,但没有深入了解。我将收到的 json 将是我刚刚创建的 Device 的一个简单对象 那么您是在创建此设备并将其发布到服务器吗?在这种情况下,您的设备需要一个 userID 属性,RestKit 可以使用该属性来填充路径模式(通常通过路由定义)。 那么我需要在Device 类中添加一个userID 变量吗?是否需要在核心数据存储中持久化? 不,它可以是暂时的 - 它只需要在您使用对象调用 POST 时进行设置。我没有尝试在路径模式中添加键路径(导航关系以获取 id) - 可能值得快速实验...... 【参考方案1】:

您通常使用RKRoute 来指定在使用指定类的对象发出特定类型(GET / POST / ...)的请求时要使用的路径模式。路由检查对象以提取适当的参数以替代路径模式。

配置路由后,只需 POST 对象而不提供 POST 方法的路径。这会导致对象管理器搜索与类型和类标准匹配的路由,以便它可以构建所需的路径。

发布时,您可以自己创建对象,RestKit 将使用收到的响应更新它并将更新保存到上下文中。

【讨论】:

又搞糊涂了。所以我更详细地查看了路由器,创建路由似乎很容易,但是我该如何创建映射呢?我可以看到实际添加我创建的映射的唯一方法是使用响应描述符,但我认为使用路由器意味着不需要响应描述符? 路由器用于发送(从模式生成发送到的路径)。响应描述符用于检查“传入”模式并决定应用哪个映射(因此目标类是什么)。 路由器实际上与映射过程无关,它完全是关于路径管理的。 啊,好吧是有道理的。使用核心数据创建新对象的一般方法是什么,因为无法使用[Class new],但是从0.1中删除了旧的[Class object]。我是否只使用标准的核心数据方法,是否有新方法? 标准核心数据方法。当您收到响应时,您可以将该对象视为要填充的存根。

以上是关于使用 RestKit 创建子对象的主要内容,如果未能解决你的问题,请参考以下文章

使用多个基本 URL 和多个对象管理器 (RestKit)

RestKit、NSFetchedResultsController 和删除孤立对象

如何使用 restkit 忽略已发布对象上的空属性

RestKit 仅用于对象映射

RestKit 更新对象映射空属性

RestKit:如何使用路由发布对象?