为浅层路由寻求最佳 RestKit/CoreData 映射和 JSON 结构的建议

Posted

技术标签:

【中文标题】为浅层路由寻求最佳 RestKit/CoreData 映射和 JSON 结构的建议【英文标题】:Seeking recommendations for best RestKit/CoreData mapping and JSON structure for shallow routes 【发布时间】:2014-02-03 21:29:01 【问题描述】:

我正在开发一个由 (Rails) REST API(支持浅路由)支持的 CoreData ios 应用。因为图中有很多对象,我希望 REST GET 不包含很多嵌套结果,而是只包含 RestKit 用来建立(错误)关系的引用。然后,我将根据需要使用浅层路由来请求单个(或一组)对象。

假设我有一个一对多 (>) 数据模型,例如 A > B,我有:

RKEntityMapping *a_mapping = [RKEntityMapping mappingForEntityForName:@"A" inManagedObjectStore:managedObjectStore];
[a_mapping addAttributeMappingsFromDictionary:@@"a_id" : @"aId", ...];
a_mapping.identificationAttributes = @[@"aId"];

RKEntityMapping *b_mapping = [RKEntityMapping mappingForEntityForName:@"B" inManagedObjectStore:managedObjectStore];
[b_mapping addAttributeMappingsFromDictionary:@@"b_id" : @"bId", ...];
b_mapping.identificationAttributes = @[@"bId"];

[a_mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"bs" toKeyPath:@"bs" withMapping:b_mapping]];

我有这些路线:

NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);

RKResponseDescriptor *a_ResponseDescriptor;
a_ResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:a_mapping method:RKRequestMethodGET pathPattern:@"/A/:aId" keyPath:@"A" statusCodes:statusCodes];

RKResponseDescriptor *b_ResponseDescriptor;
NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
b_ResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:b_mapping method:RKRequestMethodGET pathPattern:@"/B/:bId" keyPath:@"B" statusCodes:statusCodes];

[[RKObjectManager sharedManager] addResponseDescriptor:a_ResponseDescriptor];
[[RKObjectManager sharedManager] addResponseDescriptor:b_ResponseDescriptor];

我有几个相关的问题:

在返回“A”记录时我应该如何构造 JSON,以便 RestKit 为任何相关的“B”对象实例化存根?

同样,如果我想请求一堆 B 对象(没有 A 对象的先验知识),在返回“B”记录时如何构造 JSON,以便 RestKit 为拥有的“A”实例化存根'对象?

RestKit 需要哪些额外的设置/代码?

目前,我有一个方向工作(A --> B),但我似乎无法弄清楚如何让相反的工作。特别是,/A/1.json 返回如下内容:

"a": "a_id":1, "bs":["b_id": 2, "b_id": 3]

然后 B/2.json 返回:

"b": "b_id":2, "a_id": 1

我应该改用类似的东西吗:

"b": "b_id":2, "a": "a_id": 1 

?任何帮助/建议将不胜感激。

【问题讨论】:

【参考方案1】:

故障是核心数据的概念。 RestKit 涉及在数据存储中创建对象,但正是从数据存储中获取它们的行为使它们出错。听起来您更感兴趣的是让 RestKit 在数据存储中创建“存根”对象(具有正确 id 和关系但没有设置详细属性的对象),以便稍后在需要时填充它们。

/A/1.json 的当前映射和 JSON 非常适合创建 A 的存根实例和连接的 Bs 的存根。

B/2.json 只会创建一个存根B(它不会对A 做任何事情,因为映射没有附加关系信息)。这是“错误”的映射,而不是 JSON。将RKRelationshipMapping 添加到B 的映射中,将创建存根并建立连接。

也就是说,您通常不会请求B,因为您通常需要请求A 才能获得B

最后,您不需要对存根和细节进行不同的映射。只需 1 个包含所有详细信息和 id 映射的映射,RestKit 将根据收到的 JSON 做所有事情(因此,如果 JSON 仅包含 id,您将只获得存根对象)。

【讨论】:

你说得对:我不应该互换“故障”和“存根”术语。此外,不幸的是,我在最初的描述中并不清楚:我正在向 B(没有 A)发出请求,这需要反向存根。我发现只输入 ID 会导致异常,因为 RestKit 试图将它们视为具有属性的对象,而不是整数。我将在上面的描述中添加更多细节。 只要您的 JSON 始终是带有嵌套 B(作为对象)的 A 或带有嵌套 A(作为对象)的 B,那么带有嵌套映射的映射就会覆盖它。如果您的 JSON 仅包含一个 id 数组,那么您将需要不同样式的映射。 是的,这就是我发现的。我不得不建立一个双向的 RKRelationshipMappings,但这是有道理的。感谢您的帮助。【参考方案2】:

以韦恩所说的为基础,解决方案是:

建立双向 RKRelationshipMappings 在为 A 和 B 对象发送 JSON 时使用具有嵌套映射的映射。前任。 "b": "b_id":2, "a": "a_id": 1

另外,如果您使用的是 iOS 模拟器,请务必将您的 HTTP 响应标头设置为不缓存内容。自从我的代码使用过时的数据以来,这让我很受打击。

【讨论】:

以上是关于为浅层路由寻求最佳 RestKit/CoreData 映射和 JSON 结构的建议的主要内容,如果未能解决你的问题,请参考以下文章

Next.js - 带有动态路由的浅路由

寻求与管理 iBeacon 本地通知相关的最佳实践建议

寻求有关构建图形控件的最佳方法的建议

南师大刘晶波教授:寻找“深度学习”与“浅层学习”的平衡 | “有点新”论坛

至善之道——寻求最优化的物流网络模型

浅层了解String——Java面向对象基础(13)