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 与直接 CoreData

Restkit 0.20.x cocoapods 安装问题 - 编译但找不到 RestKit 的导入

RestKit / Core Data / Offline - 我需要 UUID 还是 RestKit 足够聪明?

RestKit 核心数据集成