我第一次使用RestKit并且非常高兴,不幸的是当前的项目让我开了一个循环。
首先,我有两个Feed。一个用于新闻,另一个用于照片...
新闻Feed ...
[
{"id":1234, "title":"Top story"},
{"id":1235, "title":"Next story"},
{"id":1236, "title":"Final story"}
]
照片Feed ...
[
{"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似乎忽略了提要中缺少的keyPAth。接下来,在我正在显示对象的每个视图控制器中,我运行了一些非常相似的代码......
RKObjectManager* objectManager = [RKObjectManager sharedManager];
// objectManager.inferMappingsFromObjectTypes = YES;
[objectManager loadObjectsAtResourcePath:@"json/news" delegate:self block:^(RKObjectLoader* loader) {
loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[News class]];
}];
......足够的背景。所有这些代码一起加载零新闻和零照片。如果我注释掉照片映射,我的所有新闻都会填充,如果我注释掉新闻映射,那么我的照片就会出现在商店中。
RestKit无法将每个Feed的内容与其映射匹配在一起。 setMapping:forKeyPath:中指定的键路径将不起作用,因为源没有指定任何内容。我想也许objectManager.inferMappingsFromObjectTypes = YES会让RestKit检查每个feed有什么,并选择正确的映射,但事实并非如此。另外,我假设objectMappingForClass:会自动拾取正确的映射,但没有。有没有人有任何想法如何使这项工作?
更新:实际上,即使RestKit报告第一次应用程序运行时没有加载任何项目,如果我再次停止并再次运行,我现在可以看到从缓存加载的所有20个新闻项目和20张照片。我通过运行一次确认了这一点,看到消息“缓存所有0个新闻对象以线程本地存储”然后立即打开.sqlite文件并按预期看到所有20个项目。
答案 0 :(得分:0)
这条评论:https://groups.google.com/d/msg/restkit/b0K0nCha8D0/VadnqDVB1-oJ让我走上了正确的道路。我有一个项目与现有的核心数据堆栈,一旦我删除所有相关的代码到另一组商店和上下文等,一切都有魅力。多么棒的框架。