RestKit“无法在没有数据源的情况下执行关系映射”来自本地 JSON 文件
Posted
技术标签:
【中文标题】RestKit“无法在没有数据源的情况下执行关系映射”来自本地 JSON 文件【英文标题】:RestKit "Cannot perform relationship mapping without a data source" from local JSON file 【发布时间】:2013-09-11 14:28:01 【问题描述】:(更完整的代码见我的要点:https://gist.github.com/AlistairIsrael/6521763)
我正在尝试从本地 JSON 文件映射“多”关系:
[
"name": "fruits",
"items": [
"name": "apple",
,
"name": "banana",
]
]
我有基于 wiki 上示例代码的代码: https://github.com/RestKit/RestKit/wiki/Object-Mapping#performing-a-mapping
Client.m
NSString* path = [[NSBundle mainBundle] pathForResource: @"collections" ofType: @"json"];
NSError* e;
NSString* json = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&e];
id data = [RKNSJSONSerialization objectFromData:[json dataUsingEncoding:NSUTF8StringEncoding] error:&e];
NSMutableArray* collections = [[NSMutableArray alloc] initWithCapacity:[data count]];
for (id record in data)
Collection* collection = [Collection new];
RKMappingOperation* op = [[RKMappingOperation alloc] initWithSourceObject:data destinationObject:collections mapping:[Collection mapping]];
[op start];
[collections addObject:collection];
return [NSArray arrayWithArray:collections];
当我只想映射一个“平面”对象数组时,这可以正常工作。但是,我在尝试映射嵌套对象数组时遇到了困难——这些对象本身具有一个属性,该属性是其他对象的集合。
Collection.m
@interface Collection : NSObject
@property (nonatomic, copy) NSString* name;
@property (nonatomic, copy) NSArray* items;
@implementation Collection
+ (RKMapping*) mapping
RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[Collection class]];
[mapping addAttributeMappingsFromArray:@[@"name"]];
RKPropertyMapping* itemsMapping = [RKRelationshipMapping relationshipMappingFromKeyPath:@"items" toKeyPath:@"items" withMapping:[Item mapping]]
// Commenting out the following line works, but no items
[mapping addPropertyMapping:itemsMapping];
return mapping;
如果我在Collection mapping:
中注释掉第13 行,那么Client.m
中的代码会给我一个Collection
数组(没有items
)。
但事实上,当我尝试为 Collection
的 items 属性添加 RKRelationshipMapping
时,我不断收到:
没有数据源就无法执行关系映射
我也尝试使用类似于此要点中的代码的RKMapperOperation
:
https://gist.github.com/kmc239/5846568
无济于事——我得到了一个空的NSArray
。
我错过了什么?
【问题讨论】:
【参考方案1】:dataSource
指的是RKMappingOperation
的属性,它为它提供了一个符合RKMappingOperationDataSource
的对象。这允许您实现mappingOperation:targetObjectForRepresentation:withMapping:
,以便您可以找到与提供的参数匹配的现有对象并返回这些对象(而不是总是创建新对象)。
【讨论】:
以上是关于RestKit“无法在没有数据源的情况下执行关系映射”来自本地 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章
RestKit 0.20:restkit 对象映射使属性映射加倍
将“import <RestKit/RestKit.h>”添加到 AppDelegate.m 的问题
Restkit 0.20.x cocoapods 安装问题 - 编译但找不到 RestKit 的导入