RestKit:两个独立的提要,两种不同的对象类型。一个对象管理器?

Posted

技术标签:

【中文标题】RestKit:两个独立的提要,两种不同的对象类型。一个对象管理器?【英文标题】:RestKit: two separate feeds, two different object types. One object manager? 【发布时间】:2012-02-20 00:58:11 【问题描述】:

我是第一次使用 RestKit,我很高兴,不幸的是,当前的项目让我陷入了困境。

首先,我有两个提要。一个用于新闻,一个用于照片...

新闻提要...

[
    "id":1234, "title":"Top story",
    "id":1235, "title":"Next story",
    "id":1236, "title":"Final story"
]

照片提要...

[
    "id":1919, "url":"president.jpg",
    "id":1920, "url":"celebrity.jpg",
    "id":1921, "url":"sports.jpg"
]

...在我的核心数据模型中,我创建了与这些属性匹配的这些实体。我还为 RestKit 设置了映射...

RKManagedObjectMapping* newsMapping = [RKManagedObjectMapping mappingForEntityWithName:@"News"];
newsMapping.primaryKeyAttribute = @"id";

[newsMapping mapKeyPath:@"id" toAttribute:@"id"];
[newsMapping mapKeyPath:@"title" toAttribute:@"article_id"];

[objectManager.mappingProvider setMapping:newsMapping forKeyPath:@"News"];


RKManagedObjectMapping* photoMapping = [RKManagedObjectMapping mappingForEntityWithName:@"Photo"];
photoMapping.primaryKeyAttribute = @"id";

[photoMapping mapKeyPath:@"id" toAttribute:@"id"];
[photoMapping mapKeyPath:@"url" toAttribute:@"url"];

[objectManager.mappingProvider setMapping:photoMapping forKeyPath:@"Photo"];

...在上面的代码中,我知道提要中不存在指定的 keyPaths,但提供空 keyPaths 似乎只是覆盖了映射,RestKit 似乎忽略了提要中缺少的 keyPaths。接下来,在我显示对象的每个视图控制器中,我运行一些非常相似的代码......

RKObjectManager* objectManager = [RKObjectManager sharedManager];
// objectManager.inferMappingsFromObjectTypes = YES;

[objectManager loadObjectsAtResourcePath:@"json/news" delegate:self block:^(RKObjectLoader* loader) 
    loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[News class]];
];

...足够的背景。所有这些代码一起加载零新闻和零照片。如果我注释掉照片映射,我的所有新闻项目都会填充,如果我注释掉新闻映射,我的照片就会出现在商店中。

RestKit 无法将每个提要的内容与其映射匹配在一起。 setMapping:forKeyPath: 中指定的键路径将不起作用,因为提要没有指定任何内容。我想也许 objectManager.inferMappingsFromObjectTypes = YES 会让 RestKit 检查每个提要的内容并选择正确的映射,但事实并非如此。另外,我假设 objectMappingForClass: 会自动拾取正确的映射,但不是。有没有人知道如何使这项工作?

更新:实际上,尽管 RestKit 报告应用程序第一次运行时没有加载任何项目,但如果我停止并再次运行,我现在会看到所有 20 个新闻项目和 20 张照片从缓存中加载。我通过运行一次来​​确认这一点,看到消息“将所有 0 个新闻对象缓存到线程本地存储”,然后立即打开 .sqlite 文件并按预期看到所有 20 个项目。

【问题讨论】:

【参考方案1】:

这条评论:https://groups.google.com/d/msg/restkit/b0K0nCha8D0/VadnqDVB1-oJ 让我走上了正确的道路。我有一个带有现有核心数据堆栈的项目,一旦我将所有与代码相关的代码都删除到其他商店和上下文等集合中。一切都很有魅力。多么棒的框架。

【讨论】:

以上是关于RestKit:两个独立的提要,两种不同的对象类型。一个对象管理器?的主要内容,如果未能解决你的问题,请参考以下文章

CoreData & RestKit - 从多个来源获取相同的实体类型

RestKit 不喜欢为 POST 响应映射不同的对象

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

Restkit 将多个 json 提要映射到同一个数组

RestKit 0.20 嵌套对象映射(对象树的路径不同)

如何拥有具有两种不同单元格类型的 UITableView 并以编程方式设置每个单元格布局,而不是通过情节提要?