为浅层路由寻求最佳 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
的存根实例和连接的 B
s 的存根。
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 结构的建议的主要内容,如果未能解决你的问题,请参考以下文章